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.

この述語は機能し、以下を返します。

Jest droga:フェバ

Jest droga:フェデクバ

これは、a から f に渡さなければならない部屋のリストです。run():- stdio::write("\nDroga zf do a"), R_list=["f"], go("f", "a", R_list), 失敗。しかし、これは何も返しません。お気づきかもしれませんが、これは前のケースの逆です。

4

1 に答える 1

1

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

door(A, B)Ahere はtoからの有向辺でありB door(A, B)、あなたの定義では意味もありませんdoor(B, A)

実際、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).います。ただし、必要に応じて、それを確認することもできます。

これは質問とは直接関係ありませんが、部屋に「ボンバ」があるかどうかを確認するには、not(skarb("bomba",A))

于 2011-06-30T10:07:33.173 に答える