1

これをコンパイルすると、次の 2 つのエラー メッセージが表示されます。

"Clauses of (-)/1 are not together in source-file" and
"Singleton variables: [X]"

...これらの 2 つは、私が得たエラーの例です...

事実が衝突しないように、ソース コードからいくつかの事実を削除しようとしました。また、人々を句ではなくアトムとして定義しようとしましたが、どちらも期待どおりに機能しませんでした。何か案は?

male(X).
female(X).
parent(X,Y).
father(X,Y):- male(X), parent(X,Y).
mother(X,Y):- female(X), parent(X,Y).
descendant(X,Y):- parent(Y,X).
sibling(X,Y):- descendant(X,Z), descendant(Y,Z).
brother(X,Y):- male(X), sibling(X,Y).
sister(X,Y):- female(X), sibling(X,Y).
grandparent(X,Y):- parent(X,Z), parent(Z,Y).
paternalgrandparent(X,Y):- father(X,Z), father(Z,Y).
ancestor(X,Y):- parent(X,Y).
ancestor(X,Y):- ancestor(X,Z), parent(Z,Y).
male(edward).
male(sean).
male(kevin).
female(vicky).
male(malcolm).
male(claude).
male(matthew).
female(stephania).
male(kurt).
male(david).
male(mark).
male(raymond).
female(therese).
female(nadine).
female(nathalie).
male(richard).
female(mary).
male(john).
female(lilian).
female(inez).
male(william).
female(rose).
male(richie).
female(alice).
brother(edward,vicky).
brother(kevin,sean).
brother(sean,vicky).
sister(vicky,edward).
brother(malcolm,claude).
brother(claude,malcolm).
brother(matthew,stephania).
brother(kurt,matthew).
sister(stephania,kurt).
brother(david,mark).
brother(mark,david).
sister(therese,nadine).
sister(nadine,therese).
sister(lilian,inez).
sister(inez,lilian).
father(david,edward).
mother(therese,edward).
father(mark,malcolm).
mother(nathalie,malcolm).
father(raymond,matthew).
mother(nadine,matthew).
father(richard,david).
mother(mary,david).
father(john,therese).
mother(lilian,therese).
paternalgrandparent(richard,edward).
grandparent(mary,edward).
grandparent(lilian,edward).
grandparent(john,edward).
paternalgrandparent(richard,malcolm).
grandparent(mary,malcolm).
grandparent(lilian,matthew).
grandparent(john,matthew).
father(william,richard).
mother(rose,richard).
paternalgrandparent(william,david).
grandparent(rose,david).
father(richie,william).
mother(alice,william).
paternalgrandparent(richie,richard).
grandparent(alice,richard).
ancestor(richie,william).
ancestor(alice,william).
ancestor(william,richard).
ancestor(rose,richard).
ancestor(richard,david).
ancestor(mary,david).
ancestor(david,edward).
ancestor(therese,edward).
ancestor(lilian,therese).
ancestor(john,therese).
ancestor(lilian,nadine).
ancestor(john,nadine).
ancestor(richard,mark).
ancestor(mary,mark).
4

2 に答える 2

1

「clauses are not together」は、最も簡単に修正できるエラーです。プログラムのソースに同じ名前 (たとえばmale/1、など) を持つすべてのファクトが一緒に表示されるように、プログラムのファクトを再配置するだけです。female/1

「シングルトン変数」エラーは、次の行から発生しています。

male(X).
female(X).
parent(X,Y).

変数は、ルール全体またはファクトで一度だけ言及されている場合、シングルトンです。これらの変数が必要な場合は、アンダースコアに置き換える必要があります。ただし、あなたの場合、これらの変数は必要ありません。そうでない場合、このようなルール

male(_).

は誰もが男性であると主張しますが、あなたはそれを望んでいません。これらのルールを単純に削除して、シングルトン エラーを解消する必要があります。

ただし、プログラムの最大の問題は、ルールによって既に定義したものに対してファクトを定義しようとしているように見えます。必要な事実は、、、male/1およびfemale/1ですparent/2。他のすべては、規則によって正しく導き出すことができます。

于 2013-04-23T14:52:47.833 に答える
0

それらはエラーではなく、単なる警告であるべきです。最初のメッセージは、述語をまとめて定義するように指示しています。

たとえば

male(edward).
male(sean).
male(kevin).
female(vicky).
male(malcolm).

よくない。これは、男性の定義を広めると、コードがまったく読めなくなるためです。

2 つ目は、head で変数を使用する場合は body で使用する必要があることを示しています。

たとえば

male(X).

よくない。あなたは書ける

male(_).

繰り返しになりますが、シングルトン変数は、記述しようとしているエラーの原因となることが非常に多いため、_ を使用して明示的に使用することをお勧めします。

于 2013-04-23T14:56:13.610 に答える