Je joue avec des contraintes dans (swi) prolog en utilisant la bibliothèque clpfd. J'essaie d'identifier quand un ensemble de contraintes encapsule ou subsume l'autre, p. Ex. X < 4 encapsule X < 7 à chaque fois que le premier est vrai, le second est vrai. Ceci peut être facilement représenté en utilisant l'implication logique. Cependant, je n'ai pas pu obtenir l'opérateur # ==> pour me donner le résultat que je voulais, donc j'ai recouru à l'utilisation de not (Co1 #/\ # \ Co2) où Co1 et Co2 sont des contraintes. C'est bien pour les contraintes individuelles, mais j'ai alors voulu passer une conjonctions de contraintes dans Co1 et Co2.SWI-Prolog et contraintes, bibliothèque CLP (FD)
Maintenant, voici le frotter. Lorsque je tente
X#<7 #/\ #\X#<4.
Je reviens
X in 4..6,
X+1#=_G822,
X+1#=_G834,
_G822 in 5..7,
_G834 in 5..7.
(assez curieusement, ce faisant dans les résultats SICStus dans une erreur de segmentation)
Quand je passe dans
X#<7,X#<4
I obtenir le
X in inf..3.
Évidemment, je ne peux pas passer ce dernier en not (Co1 #/\ # \ Co2), mais le premier ne me donne pas le résultat que je veux. Quelqu'un peut-il expliquer pourquoi les deux approches donnent des résultats différents, et comment je peux faire en sorte que le premier agisse comme le second?
Un grand merci, je traite des inégalités linéaires. J'essaie de trouver automatiquement des plages pour un ensemble de contraintes conjonctives (éventuellement annulées). Ainsi, je voudrais pouvoir passer (par exemple) X # <4,\#(X#> 2), qui fonctionne. J'aimerais aussi passer quelque chose de plus complexe, p. X # <4,#\\(X#> 2, X # <1), ce qui ne fonctionne pas, car # \ est alors traité comme un opérateur binaire. De même, en lui donnant X # <4,#\\((X#> 2, X # <1)) entraîne également une erreur. – Nir
Pour annuler une conjonction, vous devez utiliser #/\, par exemple: # \ (A #/\ B). – mat