Ich spiele mit Einschränkungen in (Swi) Prolog mit der Clpfd-Bibliothek.SWI-Prolog und Constraints, Bibliothek CLP (FD)
Ich versuche zu identifizieren, wenn ein Satz von Einschränkungen den anderen einkapselt oder subsumiert, z. X < 4 kapselt X < 7 wie immer, wenn ersteres wahr ist, letzteres ist wahr. Dies kann leicht durch logische Implikation dargestellt werden. Allerdings konnte ich den # ==> Operator nicht erhalten, um mir das gewünschte Ergebnis zu geben, also habe ich auf die Verwendung von nicht (Co1 #/\ # \ Co2) zurückgegriffen, wobei Co1 und Co2 Beschränkungen sind. Das ist für einzelne Constraints gut, aber ich wollte dann Conjunctions von Constraints in Co1 und Co2 übergeben.
Jetzt ist hier die reibung. Als ich
X#<7 #/\ #\X#<4.
versuchen bekomme ich zurück
X in 4..6,
X+1#=_G822,
X+1#=_G834,
_G822 in 5..7,
_G834 in 5..7.
(seltsam genug, dies in einem Segmentierungsfehler in SICStus Ergebnisse tun)
Wenn ich pass in
X#<7,X#<4
I Holen Sie sich die gewünschte
X in inf..3.
Offensichtlich kann ich letzteres nicht übergeben (Co1 #/\ # \ Co2), aber ersteres gibt mir nicht das Ergebnis, das ich will. Kann jemand erklären, warum die beiden Ansätze zu unterschiedlichen Ergebnissen führen, und wie kann ich die beiden dazu bringen, so zu handeln?
Vielen Dank, ich mit linearen Ungleichungen zu tun habe. Ich versuche automatisch Bereiche für eine Reihe konjugierter (möglicherweise negierter) Abhängigkeiten zu finden. Daher würde ich gerne in der Lage sein, (zum Beispiel) X # <4,\#(X#> 2), was funktioniert. Ich möchte auch etwas Komplexeres, z.B. X # <4,#\\(X#> 2, X # <1), was nicht funktioniert, da das # \ dann als binärer Operator behandelt wird. In ähnlicher Weise führt auch die Angabe von X # <4,#\\((X#> 2, X # <1) zu einem Fehler. – Nir
Um eine Konjunktion zu negieren, müssen Sie #/\ verwenden, zum Beispiel: # \ (A #/\ B). – mat