0

割り当てのために、fire_code への準拠をテストするためのルール ベースのシステムを作成する必要があります。

roomHasFastExit は、他の部分が建築計画の一部である私のテスト句です

この場合、Rm は wotl1 に等しい

roomHasFastExit(Rm):- hasDoor(Rm, Door), isa(Door, outsideDoor).

hasDoor(wolt1, wodoorlt1c).
hasDoor(wolt1, wodoorlt1exit).
hasDoor(wolt1, wodoor115lt1).

isa(wodoor115lt1, door).
isa(wodoorlt1c, door).
isa(wodoorlt1exit, outsideDoor).

私が発生している問題は、要求したドアが準拠していないことがわかった場合、次のドアを確認する必要があることです。句を再帰的に呼び出すと、同じドアを取得するだけです。各ドアをループして確認するにはどうすればよいですか?準拠しています。

4

1 に答える 1

0

あなたのコードはもう大丈夫です:

?- roomHasFastExit(Rm).
Rm = wolt1 ;
false.

データベースの各レコードを「ループ」する必要がある場合は、むしろ、クエリを満たす可能性のある各代替案を評価しています。

Prolog では、このリレーショナルな視点はバックトラッキングによって取得され、トップダウンの順序で完全な検索が可能になります。

インタープリターの最上位レベルでは、「;」を使用してこれを実装します

?- hasDoor(wolt1,X).
X = wodoorlt1c ;
X = wodoorlt1exit ;
X = wodoor115lt1.

完全な評価を強制する便利なライブラリ述語はforall /2 です。例えば

show_available_doors(Room) :-
    forall(hasDoor(Room, Door), writeln(Door)).

出力:

?- show_available_doors(wolt1).
wodoorlt1c
wodoorlt1exit
wodoor115lt1

Prolog は、アルゴリズムを表現する際に主な構文構造としてリストを使用します: findall /3 リストを構築し、クエリを完全に評価する単純なビルトインです:

?- findall(Door, hasDoor(Room, Door), Doors).
Doors = [wodoorlt1c, wodoorlt1exit, wodoor115lt1].
于 2012-04-01T04:45:32.247 に答える