2012-11-30 6 views
1

je dois écrire un programme Prolog pour trouver des chemins, par exemple, pour le graphique:trouver dans Prolog

edge(a, b). 
edge(a, c). 
edge(c, b). 

et le cas de test sont:

/* test case 1 */ 
?- path(a, b, P). 
P = [a, b] ; 
P = [a, c, b] ; 
false. 

/* test case 2 */ 
?- path(c,b,[c,b]). 
true. 

et mon code est

path(X,Y,[X,Y]):- 
    edge(X,Y). 
path(X,Z,[X|P]):- 
    edge(X,Y), 
    path(Y,Z,P). 

Cependant, pour le cas de test 2, mon code affichera

?- path(c,b,[c,b]). 
true; 
false. 

Je sais que je devrais ajouter une coupe dans mon code pour enlever le faux dans le cas 2, mais il enlèvera le faux dans le cas 1 aussi. Comment puis-je résoudre ce problème?

+0

Lorsque j'essaye ceci dans SWI-Prolog, j'obtiens un faux dans le second cas. – RonaldBarzell

+1

C'est à cause du nom des atomes, et je l'ai corrigé. Désolé pour ça –

Répondre

1

Son parce que vos deux fonctions sont identiques et je pense que prolog vérifie les deux .... dans le premier cas, il échoue parce qu'une seule de la fonction le vérifie ie chemin (c, b, P) mais dans le second cas chemin (c, b, [c, b]

Il vérifie à la fois les fonctions

path(X,Y,[X|P] here X = c and P = b 
and 
path(X,Y,[X,Y]) here also X=c and Y = b 

de façon à la fois les fonctions agissent même dans le second cas, vous devez modifier un de vos cas pour par exemple.: pour 2 sommets seulement, vous pouvez utiliser

path(X,Y,[X|Y|[]]):- edge(X,Y). 

au lieu de

path(X,Y,[X,Y]):- 
edge(X,Y). 

il attendre que deux variables et je pense que cela devrait résoudre votre problème.