4

次の述語doorがあるとします。これは、2 つの部屋の間にドアがあることを宣言します。

door(office, hall).
door(kitchen, office).
door(hall, "dining room").
door(kitchen, cellar).
door("dining room", kitchen).

そして、ドアの状態を宣言する述語doorstate :

doorstate(hall, office, closed).
doorstate(hall, "dining room", opened).
doorstate("dining room", kitchen, opened).
doorstate(kitchen, office, opened).
doorstate(kitchen, cellar, opened).

2 つの部屋の間のすべてのドアが開いている場合、2 つの部屋の間に通路があります。

2 つの部屋の間にそのような経路があるかどうかを検出するルールを作成するにはどうすればよいでしょうか?

4

4 に答える 4

5

プロローグの悲惨な恐怖があまりにも早く戻ってきます。

wayopen(Room1,Room2) :- doorstate(Room1, Room2, opened).
wayopen(Room1,Room2) :- doorstate(Room1, RoomX, opened), wayopen(RoomX,Room2).

だから私はあなたのために宿題をやっているだけではありません。それを理解する方法は次のとおりです。

  • 2 つの部屋がドアでつながっていて、ドアが開いている場合、2 つの部屋の間の道は開いています。
  • 最初の道に別の部屋へのドアが開いていて、別の部屋から 2 番目の部屋への道がある場合、その道は 2 つの部屋の間で開かれています。

これらのルールは、一方向にのみドアを通過できることに注意してください。あなたの宿題は、それを双方向で機能させることです。

ホールからどこに行くことができますか?

?- wayopen(hall, X).
X = diningroom ;
X = kitchen ;
X = office ;
X = cellar ;
false.

出入りできるすべての部屋は次のとおりです。

?- wayopen(Room1,Room2).
Room1 = hall,
Room2 = diningroom ;
Room1 = diningroom,
Room2 = kitchen ;
Room1 = kitchen,
Room2 = office ;
Room1 = kitchen,
Room2 = cellar ;
Room1 = hall,
Room2 = kitchen ;
Room1 = hall,
Room2 = office ;
Room1 = hall,
Room2 = cellar ;
Room1 = diningroom,
Room2 = office ;
Room1 = diningroom,
Room2 = cellar ;
false.
于 2009-03-25T00:58:46.283 に答える
1

exists_way/2対称で推移的な関係()を記述する必要があります。

% Base cases
exists_way_(hall, 'dining room').
exists_way_('dining room', kitchen).
exists_way_(kitchen, office).
exists_way_(kitchen, cellar).

% Symmetric
exists_way(R1, R2) :- exists_way_(R1, R2) ; exists_way_(R2, R1).

% Transitive
exists_way(R1, R2) :-
    exists_way_(R1, R3),
    exists_way(R3, R2).

ただし、このコードはソリューションを過剰に生成します。したがって、後で重複を除外する必要があります。

于 2009-03-25T18:03:41.937 に答える
1

exists_way/2対称で推移的な関係 ( ) を記述する必要があります。テーブル化をサポートする Prolog ( XSBなど) では、これらの関係を非常に自然な方法で、つまり数学の本で表現されているように表現できます。

:- table exists_way/2.

% Open doors
exists_way(hall, 'dining room').
exists_way('dining room', kitchen).
exists_way(kitchen, office).
exists_way(kitchen, cellar).

% Symmetry
exists_way(R1, R2) :-
    exists_way(R2, R1).

% Transitivity
exists_way(R1, R2) :-
    exists_way(R1, R3),
    exists_way(R3, R2).

この場合、クエリexists_way(R1, R2)はちょうど 25 の一意のソリューションを提供します。

于 2009-04-11T20:42:25.270 に答える
-1

学習の精神で: これは、おそらくプロローグ コースの最初の週に行った祖父母の問題と同じ問題です。

プロローグで行うことの多くは、構造が非常に似ていることがわかります。そのため、再帰述語についての考え方と、修正と実行のために節がどのような順序で行われなければならないかを把握しておいてください。

たとえば、可能であれば非末尾再帰を避ける必要があります。

于 2009-04-20T11:26:29.270 に答える