2012-03-26 18 views
0

Die Abfrage ?- go(c, g). gibt false zurück, gibt aber für ?- go(a, d). den Wert wahr an. Ich verstehe es nicht wirklich, da ich die richtigen Regeln hinzugefügt habe, und für die meisten von ihnen funktioniert es.Testen in der Konsole

Hier sind die Aussagen Ich verwende:

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), !. 

Antwort

0

Sie müssen Akkumulator Ihr Prädikat hinzufügen wurde in inf Schleife zu vermeiden, stecken.

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). 
+0

Ich kann nicht becus ändern Dies ist der Plan, den wir verwenden müssen die Regeln, die möglicherweise falsch sein – user1232622

+0

Was ist Ihre Frage? – whd

+0

meine Frage ist, dass gehen (c, g). sollte ja sagen, aber warum sagt es nein, wenn ich es in die Konsole stecke – user1232622

0

Sie sollten vierte Regel

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

lesen, weil Sie bereits die Suchreihenfolge/2 Aufruf Tür getauscht, aber dies führt, wie richtig bemerkt von @whd zu Looping. Hier ist eine Version, die 'Rückkehr' der Weg

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). 

Test:

enter image description here

?- go(c,g,[],P). 
P = [g, e, b, c, d] ; 
P = [g, e, b] ; 
false. 

Aufgrund Prolog Suchauftrag, ist es eine Tour dauert 'in d, bevor sie wieder gehen. Es ist leicht zu vermeiden, auf den SoFar-Parameter auf der obersten Ebene Anruf zu handeln ...

+0

die 4. Regel, die Sie mir gesagt, um NextRoom ändern und FromRoom können Sie mir sagen, warum dies getan werden sollte, dann dann ich kann besser verstehen – user1232622

+0

Entschuldigung, ich kann nichts klarer als das, was ich bereits erklärt habe, denken – CapelliC