3

これが私の質問です。ある小さなクラブが、メンバー間の緊急メッセージ用に電話ネットワークを設定することにしました。次の取り決めが合意されました。アンはビルとメアリーの両方に電話をかけることができます。ビルはトムとスーの両方に電話をかけることができます。トムはリズとフランクの両方に電話をかけることができます。リズは必要に応じてフランクに電話することもできます。

この情報を 7 つのプロローグ ファクトとして表現します can_phone(anne,bill)。ここで、述語 message_route の再帰的な Prolog ルールを記述します。これは、クラブの電話手配を使用して、list 内の人々を介して routedにメッセージを渡すことができるmessage_route(A,B,R)場合に trueになります。たとえば、 true になります (電話できる人、電話できる人、電話できる人、電話できる人のため)。ABRmessage_route(anne,frank,[anne,bill,tom,liz,frank])annebilltomlizfrank

私はこれまでのところこれを持っています:

can_phone(anne,bill).
can_phone(anne,mary).
can_phone(bill,tom).
can_phone(bill,sue).
can_phone(tom,liz).
can_phone(tom,frank).
can_phone(liz,frank).

私のmessage_route場合、私は実験し、リストを特定の人のリストに制限する必要なしに質問の2番目の部分を完了することができるように、この作業を行いました(R)。

message_route(A,B) :- can_phone(A,B).
message_route(A,B) :- can_phone(A,X), message_route(X,B).

私の回答でこのリストを実装する方法がわかりません。

4

1 に答える 1

3

リストの蓄積は比較的簡単です。まず、直接A呼び出すことができる場合B、リストは単に[A, B]. したがって、最初のルールを次のように書き直すことができます。

message_route(A,B,[A,B]) :- can_phone(A,B).

2 番目のルールは少しトリッキーです: によって生成されたリストに統合し、その先頭message_routeに挿入する必要があります。orAを挿入する必要がないことに注意してください。これらは返されるリストによって提供されるためです。XB

message_route(A,B,[A|Tail]) :- can_phone(A,X), message_route(X,B,Tail).

これはあなたのデータを使用した小さなデモです

提示するデータがツリーではなくループを含むグラフを表す場合、このコードは独自のテールを追跡することに注意してください。Xこれを避けるために、すでにリストに含まれている場合は選択を避けることができますTail

于 2013-03-07T16:36:10.693 に答える