2 votes

Prolog clpfd : : opérateur attendu

Chère communauté Stackoverflow,

Je voulais juste tester la bibliothèque de programmation logique contrainte (clpfd) pour Prolog. J'inclus donc la bibliothèque en appelant

:- use_module(library(clpfd)).

Ensuite, je veux faire quelque chose comme ce qui suit.

[X,Y] :: [1..2], X #\= Y, X+Y #\= 3.

Mais on me répond toujours que

ERROR: Syntax error: Operator expected
ERROR: [X,Y]
ERROR: ** here **
ERROR:  :: [1..2], X #\= Y, X+Y #\= 3 .

Le même phénomène se produit lors de l'exécution de l'exemple suivant

? member(X,[42,1,17]), [X,Y] :: [0..20].

ERROR: Syntax error: Operator expected
ERROR: member(X,[42,1,17]), [X,Y]
ERROR: ** here **
ERROR:  :: [0..20] .

Il semble que Prolog ne reconnaisse pas correctement l'opérateur : :. Toute aide est la bienvenue

2voto

CommuSoft Points 6439

Pour autant que je sache, il n'y a pas (::)/2 dans les clpfd bibliothèque. Vous recherchez probablement le ins/2 prédicat. Par exemple :

?- [X,Y] ins 1..2, X #\= Y, X+Y #\= 3, label([X,Y]).
false.

?- [X,Y] ins 1..3, X #\= Y, X+Y #\= 3, label([X,Y]).
X = 1,
Y = 3 ;
X = 2,
Y = 3 ;
X = 3,
Y = 1 .

Donc si X y Y sont en 1..2 alors il n'y a pas de solution, puisque votre première contrainte dit que X doit être différent de Y et la deuxième contrainte dit que X + Y doit être différent de 3 .

Au cas où nous ajouterions 3 au résultat, alors il y a des solutions.

Nous pouvons ici utiliser ins/2 à filtrer également :

?- member(X,[42,1,17]), [X,Y] ins 0..20.
X = 1,
Y in 0..20 ;
X = 17,
Y in 0..20.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X