Prolog 在控制台中进行测试

Prolog 在控制台中进行测试,prolog,Prolog,consult?-go(c,g)。返回false,但?-go(a,d)的状态为true。。我并不真正理解它,因为我已经添加了适当的规则,并且对大多数规则都有效 以下是我使用的语句: door(a, b). door(b, c). door(c, d). door(b, e). door(e, f). door(e, g). go(FromRoom, ToRoom):- door(FromRoom,ToRoom). go(FromRoom, ToRoom):- door(T

consult
?-go(c,g)。
返回false,但
?-go(a,d)的状态为true。
。我并不真正理解它,因为我已经添加了适当的规则,并且对大多数规则都有效

以下是我使用的语句:

door(a, b).
door(b, c).
door(c, d).
door(b, e).
door(e, f).
door(e, g).

go(FromRoom, ToRoom):- 
    door(FromRoom,ToRoom).

go(FromRoom, ToRoom):- 
    door(ToRoom, FromRoom).

go(FromRoom, ToRoom) :-  
    door(FromRoom, NextRoom),
    go(NextRoom, ToRoom), !.

go(FromRoom, ToRoom):-
    door(ToRoom,NextRoom), 
    go(NextRoom, FromRoom), !.

您需要向谓词添加累加器,以避免陷入inf循环

door(a, b).
door(b, c).
door(c, d).
door(b, e).
door(e, f).
door(e, g).

go(From, To, T) :-
    T=[From|T1],
    go(From, To, [To], T1).
go(From, To,T, T) :-
    door(From, To),!.
go(From,To,T,T) :-
    door(To,From),!.
go(From, To, Acc,T) :-
    door(X, Do),!,
    \+ member(X, Acc),
    go(From, X, [X|Acc],T).
go(From,To,Acc,T) :-
    door(X,Z),!,
    \+member(Z,Acc),
    go(X,To,[X|Acc],T). 

第四条规则应该是

go(FromRoom, ToRoom):- 
 door(ToRoom,NextRoom), 
 go(FromRoom,NextRoom),!.
因为您已经在调用door/2时交换了搜索顺序,但是这会导致循环,正如@whd正确地指出的那样。这里是一个“返回”路径的版本

go(Room, Room, Path, Path).

go(FromRoom, ToRoom, SoFar, Path) :-
    ( door(FromRoom, NextRoom) ; door(NextRoom, FromRoom) ),
    \+ member(NextRoom, SoFar),
    go(NextRoom, ToRoom, [NextRoom|SoFar], Path).
测试:


由于Prolog的搜索顺序,它在返回之前在
d
中“进行一次巡演”。在顶层调用时,很容易避免对SoFar参数进行操作…

我无法更改,因为这是我们必须使用的计划,其规则可能是错误的。我的问题是go(c,g)。应该说是的,但为什么我把它放在控制台上时它会说不呢?你一定要让我检查一下。。。前两个谓词将失败,因为没有门(c,g),也没有门(g,c)。第三个谓词也将失败,因为只有门(c,d)。并且没有任何门(d,X)。第三个谓词也会失败,因为没有任何门(g,X)。只有这6种方式,你可以旅行,你也可以向后旅行,所以如果你画它,你会看到它会是什么样子,但我仍然在用go(c,g)进行斗争。为什么会出现虚无?答案是正确的。你需要看什么?如果你换了门(b,e)。那个人进了门(d,e)。那么答案是肯定的……你告诉我的第四条规则是在下一个房间和下一个房间改变的,你能告诉我为什么要这样做,这样我才能更好地理解吗?对不起,我想没有比我已经解释的更清楚的了
?- go(c,g,[],P).
P = [g, e, b, c, d] ;
P = [g, e, b] ;
false.