0

Prologを使用する必要がある学校のプロジェクトがあります。これは私にとってすべて新しいことなので、いくつかの問題があります。

次のようなリストがあります。

List = [(_,_,_),(_,_,_),(_,_,_)]

作成しなければならないいくつかの述語を通じて、各メンバーに関する入力情報を受け取ることになっています。

そのうちの 1 つは次のタイプです。

predicate(M1,M2,M3, List)

また、M1 は M2 または M3 のいずれかであり、両方ではないことが示されています。例えば、

predicate((_,a,_),(2,_,_),(3,_,_),List)

「a」を持つメンバーは、最初のフィールドに 2 または 3 があることを示します。

私は一晩中試してみましたが、解決策が思いつきません。統合を使用する必要があると思いますが、その方法がわかりません。

私はこれを試しました:

predicate(M1,M2,M3,[_]) :- (M1=M2), not(M1=M3).
predicate(M1,M2,M3,[_]) :- (M1=M3), not(M1=M2).

これはばかげているように見えるかもしれませんが、私が言ったように、Prolog は私にとってまったく新しいものであり、その機能を完全に把握することはできません。

どんなヒントでも大歓迎です。ありがとう!

編集:

例:

person(name,age,job).
List = [(einstein,_,_),_,_].

これで、アインシュタインが最初の 3 人のリストができました。

predicate = ((einstein,_,_),(_,87,_),(_,23,_), List).

List = [(einstein,87,_),_,_)];
List = [(einstein,23,_),_,_)].

これらは、述語を適用した後に受け入れられる 2 つのリストです。

それは簡単な問題のはずですが、私には理解できません。

ありがとう!

4

3 に答える 3

1

私は次のように書きます:

predicate(M1,M2,M3,L):- member(M1,L),member(M1,[M2,M3]).

あなたは「M1 は M2 または M3 のいずれかであり、両方ではない」と言っていますが、それはこの述語の呼び出し元としてのあなたの責任だと思います。equalM2とを指定した場合は、それらを等しくしたかっM3たことは明らかです。そして、あなたがそれらを異なって供給した場合、まあ、それは彼らが何であるかです.

于 2013-05-17T16:44:33.997 に答える
1

リストの要素をバインドする必要があると思います:

predicate(M1, M2, M3, [M1, M2, M3]) :-
    M1 = M2, M1 \= M3
  ; M1 = M3, M1 \= M2.

編集:コメントの後

predicate(M1, M2, M3, List) :-
    member(M1, List),
    ( M1 = M2, M1 \= M3 ; M1 = M3, M1 \= M2 ).

Member/2 リストとその要素の間の Prolog における最も基本的な関係です。ここでは、ソリューションの検索中に、基になるエンジンが変数をバインドする機能を示しています。

あなたのデータは

?- predicate((einstein,_,_),(_,87,_),(_,23,_), [E]).
E = (einstein, 87, _G3908) ;
E = (einstein, 23, _G3908).
于 2013-05-17T05:39:45.310 に答える