2010-04-27 4 views
2

Je suis d'écrire un programme qui fait cela:Comprendre Prolog [liste]

?- pLeap(2,5,X,Y). 
X = 2, 
Y = 3 ; 
X = 3, 
Y = 4 ; 
X = 4, 
Y = 5 ; 
X = 5, 
Y = 5 ; 
false. 

(donne toutes les paires X, X + 1 entre 2 et 5, ainsi que le cas particulier à la fin).

Ceci est censé être la solution. Je ne comprends pas vraiment comment cela fonctionne, quelqu'un pourrait-il me guider à travers?

pLeap(X,X,X,X). 
pLeap(L,H,X,Y) :- 
     L<H, 
     X is L, 
     Y is X+1. 
pLeap(L,H,X,Y) :- 
     L=<H, 
     L1 is L+1, 
     pLeap(L1,H,X,Y). 

Je ferais tout simplement comme ceci:

pLeap(L,H,X,Y) :- 
     X >= L, 
     X =< H, 
     Y is X+1. 

Pourquoi ne pas travailler (en ignorant le cas particulier à la fin)?

Répondre

2

Les opérateurs >= et =< n'instancent pas leurs arguments et vous ne pouvez les utiliser qu'une fois que les arguments ont déjà été instanciés.

En d'autres termes, dans la solution donnée, X et Y sont des valeurs avec is, et les < et =< opérateurs ne sont utilisés que sur L et H, dont les valeurs sont données par l'utilisateur. (Sur la solution donnée, essayez pLeap(L,H,2,3) et vous obtiendrez le même problème que vous éprouvez.)

Dans votre cas, cependant, vous essayez d'utiliser >= et =< sur X, qui n'a pas de valeur encore et donc l'interprète se plaint.

4

Vous pouvez utiliser la bibliothèque clpfd pour votre problème.

:- use_module(library(clpfd)). 

pLeap(L,H,X,Y) :- 
    X in L..H, 
    Y #= min(H, X+1), 
    label([X]). 

est ici la sortie:

?- pLeap(2,5,X,Y). 
X = 2, 
Y = 3 ; 
X = 3, 
Y = 4 ; 
X = 4, 
Y = 5 ; 
X = 5, 
Y = 5.