2011-06-30 12 views
1

私は部屋でドアのリストを定義している:ビジュアルプロローグ - 迷路問題

class facts 
door : (string Room1, string Room2). 
skarb : (string Skarb, string Room). 

class predicates 
go : (string Room1, string Room2, string* R_list) nondeterm anyflow. 
is_Member : (string Room, string* R_list) nondeterm . 
write_list : (string* R_list) nondeterm . 
    clauses 
door("a", "b"). 
door("b", "e"). 
door("b", "c"). 
door("d", "e"). 
door("c", "d"). 
door("e", "f"). 
door("g", "e"). 
door("g", "a"). 
door("h", "b"). 
door("h", "a"). 
door("h", "f"). 
door("i", "b"). 
door("i", "h"). 
door("i", "c"). 
door("i", "k"). 
skarb("bomba", "d"). 

そして、いくつかの述語:

go(Room, Room, R_list) :- stdio::write("\n\nJest droga:"), write_list(R_list), !. 
go(Room1, Room2, R_list) :- door(Room1, X), not(is_Member(X, R_list)), go(X, Room2, [X | R_list]). 

go(Room1, Room2, R_list) :- door(X, Room1), not(is_Member(X, R_list)), go(Room2, X, [X | R_list]). 

is_Member(Room, [Room | _]) :- !. is_Member(Room, [_ | Tail]) :- is_Member(Room, Tail). 

write_list([]) :- !. 
write_list([Head | Tail]) :- stdio::write(Head), write_list(Tail). 

そして、私は部屋から部屋への道を探しています:

run():- 
stdio::write("\nDroga z a do f"), 
R_list=["a"], 
go("a", "f", R_list), 
fail. 

この述語は、作品と返す:

冗談のdroga:FEBA

冗談のdroga:私はからFに渡す必要があること、部屋のリストであるFEDCBA

。 run(): R_list = ["f"]、 go( "f"、 "a"、R_list)、 が失敗します。 しかし、これは何も返しません。あなたが気づくかもしれないが、それは前のケースのちょうど逆です。

答えて

1

この質問は宿題のような匂いがします。適切にタグ付けする必要があります。ここ

door(A, B)も事実door(B, A)

を意味するものではありませんAから、あなたの定義でdoor(A, B) Bに向けエッジで、fは任意の他の部屋にはつながりません。それは多かれ少なかれデッドエンドです。

免責事項:私が提案している方法よりも良い方法があるかどうかはわかりません。 また、今すぐテストすることができないので、私は確かにpathが正しく書かれているとは確信していません。

reversible_door(A,B):- door(A,B). 
reversible_door(A,B):- door(B,A). 

をしかし、あなたはまだサイクルに注意する必要があります。

あなたはそうのような新しいルールを構築することができます。訪問した部屋を追跡することで、サイクルを避けることができます。もちろん

path(A,B,_):- reversible_door(A,B). 
path(A,B,Nodes):- reversible_door(A,X), 
        not(member(X,Nodes)), 
        path(X,B,[A|Nodes]). 

ことがすでに暗示だ場合は、これも素晴らしい、door(A, A).のように、何の自己エッジが存在しないと仮定しています。しかし、あなたがしたい場合は、それを確認することもできます。

これは質問に直接関係していませんが、客室に「bomba」があるかどうかを確認するにはnot(skarb("bomba",A))