-2

私は swi-prolog の基本を学ぼうとしていますが、単純な家系図から始めました。コードをコンパイルしようとするSyntax error: Operator expectedと、47 ~ 53 行目でSingleton variables:[B, C]警告が表示され、60 行目と 61 行目で警告が表示されます。感謝します。また、誰かが優れた swi-prolog コンパイラを推奨できれば、それは大歓迎です。

これがコードです

%
%Lineage
%

parent_child(stan, lisa).
parent_child(stan, steve).
parent_child(gertrude, steve).
parent_child(steve, adam).
parent_child(steve, brian).
parent_child(steve, jessie).
parent_child(ann, jessie).
parent_child(lisa, dave).
parent_child(allice, adam).
parent_child(ann, brian).

%
%Gender
%

male(adam).
male(brian).
male(dave).
male(kyle).
male(steve).
male(stan).
female(allice).
female(ann).
female(jessie).
female(gertrude).
female(lisa).

%
%Relation Clauses
%

father(X, Y) :- parent_child(X, Y), male(X).
mother(X, Y) :- parent_child(X, Y), feamle(X).

grandfather(X, Z) :- parent_child(X, Y), parent_child(Y, Z), male(X).
grandmother(X, Z) :- parent_child(X, Y), parent_child(Y, Z), female(X).

brother(X, Y) :- parent_child(A, X), parent_child(B, X), parent_child(A, Y), 
                 parent_child(B, Y), female(A), male(B), male(Y).
brothers(X, Y) :- parent_child(A, X), parent_child(B, X), parent_child(A, Y), 
                  parent_child(B, Y), female(A), male(B), male(X), male(y).
sister(X, Y) :- parent_child(A, X), parent_child(B, X), parent_child(A, Y), 
                parent_child(B, Y), female(A), male(B), female(Y).
sisters(X, Y) :- parent_child(A, X), parent_child(B, X), parent_child(A, Y), 
                 parent_child(B, Y), female(A), male(B), female(X), female(Y).

aunt(X, Y) :- parent_child(A, X), parent_child(B, Y), Parent(A, B).
aunt_nephew(X, Y) :- parent_child(A, X), parent_child(B, Y), Parent(A, B), 
                     female(X), male(Y).
aunt_niece(X, Y) :- parent_child(A, X), parent_child(B, Y), Parent(A, B), 
                    female(X), female(Y).

uncle(X, Y) :- parent_child(A, X), parent_child(B, Y), Parent(A, B).
uncle_nephew(X, Y) :- parent_child(A, X), parent_child(B, Y), Parent(A, B), 
                      male(X), male(Y).
uncle_niece(X, Y) :- parent_child(A, X), parent_child(B, Y), Parent(A, B), 
                     male(X), female(Y).

cousin(X, Y) :- parent_child(A, X), parent_child(C, A), parent_child(B, Y), 
                parent_child(C, B).
cousin_male(X, Y) :- parent_child(A, X), parent_child(C, A), 
                     parent_child(B, Y), parent_child(C, B), male(Y).
cousin_female(X, Y) :- parent_child(A, X), parent_child(C, A), 
                       parent_child(B, Y), parent_child(C, B), female(Y).

half_brother(X, Y) :- parent_child(A, X), parent_child(A, Y), 
                      parent_child(B, X), parent_child(C, Y), male(X).
half_sister(X, Y) :- parent_child(A, X), parent_child(A, Y), 
                     parent_child(B, X), parent_child(C, Y), female(X).
4

1 に答える 1

1

brothers(X,Y):- ... male(B), male(X), male(y).すべての変数は大文字で始まる必要がありますの 2 番目の句にタイプミスがあります。

すべての述語は小文字で始める必要があります。47 ~ 53 行目には、Parent(A, B)大文字で始まる述語呼び出し " " があります。これは無効な構文です。に変更するparent(A, B)と、エラーはなくなります。

シングルトン変数に関する警告は、その変数が述語の本体で一度だけ使用されること、つまりその値が使用されないことを意味します。代わりに名前のない var を使用できます_。通常、これは何かを見落としていることを意味します。

ここで、あなたはおそらくそれを意味しましたB \= C. おそらくXや など、他の変数にも同じことが言えます。Y

異なる名前の変数を使用するだけでは、それらの値が異なることは保証されません。両方の変数がインスタンス化された後、明示的なチェックを追加する必要があります。インテントをインスタンス化するに登録するには、次を使用する必要がありますdif/2

2 ?- dif(X,Y),X=1,Y=2.

X = 1
Y = 2

3 ?- dif(X,Y),X=1,Y=1.

No
于 2013-04-24T20:17:47.497 に答える