Jestem początkujący w programowaniu logicznym. Próbuję napisać program, który może znaleźć wszystkie węzły, które mogą dotrzeć do określonego hosta.
Oto mój kod:
link(0, 1).
link(3, 4).
link(1, 2).
link(2, 0).
link(2, 1).
link(3, 2).
link(4, 3).
Więc pokaż wyżej na wykresie, to powinno wyglądać tak, jak pokazano poniżej:
Chcę zrobić coś takiego:
?- go(X,0).
X=1;
X=2;
X=3;
X=4;
....
Oznacza to, że ze wszystkich 1,2,3 i 4 może przejść do 0.
[1->2->0],[2->0],[3->2->0],[4->3->2->0]...
dlatego staram się
go(X,Y) :- link(X,Y).
go(X,Y) :- link(X,Z),go(Z,Y).
?- go(X,0).
X=2;
X=0;
X=0;
X=0;
X=0;
....
ale nie chcę, aby 0 był jednym z wyjściowych danych, nie ma sensu pokazywać, że mogę przejść do 0, gdy jestem już w 0. Poza tym, to ciągle się powtarza. Staram się rozwiązać ten problem za pomocą:
go(X,Y) :- link(X,Y).
go(X,Y) :- (X\==Y),link(X,Z),go(Z,Y).
?- go(X,0).
X = 2 ;
false.
Nie jestem pewien, dlaczego zatrzymuje się na X=2. Próbuję narysować drzewo wyszukiwania prologu, a ja wciąż nie wiem, dlaczego mój kod nie będzie nadal szukać innych faktów(link(3,4)). Wydaje się, że w pewnym momencie zatrzyma się i nie idź dalej do zielonej części poniżej:
Staram się go przetestować za pomocą go(1,0). iść(4,0). do przodu(1,0) i do przodu(2,0) sukces Ale go(3,0) i go(4,0) zwraca błąd: limit stosu. Odkryłem, że rekursja wszystko trwa i trwa między węzłami 3 i 4. Ale ja naprawdę nie wiem, jak to rozwiązać.
Teraz jestem tak zdezorientowany, proszę, powiedz mi, w czym mój błąd lub jak prawidłowo zaimplementować tę funkcję? Dziękuję.