0

Prologでプログラミングを始めたばかりです。私はいくつかの条項を書きました。

predicates
parent(symbol,symbol)
male(symbol)
female(symbol)
mother(symbol,symbol)
father(symbol,symbol)
brother(symbol,symbol)
sister(symbol,symbol)
uncle(symbol,symbol)
clauses
parent(arthur,fred).
parent(arthur,george).
parent(arthur,bill).
parent(arthur,percy).
parent(arthur,ginny).
parent(arthur,ron).
parent(arthur,charlie).



parent(molly,fred).
parent(molly,george).
parent(molly,bill).
parent(molly,percy).
parent(molly,ginny).
parent(molly,ron).
parent(molly,charlie).
parent(rowling,arthur).
parent(rowling,james).


parent(james,harry).
parent(lily,harry).

female(molly).
female(ginny).
female(lily).
female(rowling).


male(X) if not(female(X)).


brother(X,Y) if male(Y),X<>Y,brother(Y,X).
brother(X,Y) if X<>Y,parent(Z,X),parent(Z,Y),male(X).

mother(X,Y) if parent(X,Y),female(X).
father(X,Y) if parent(X,Y),male(X).
sister(X,Y) if parent(Z,X),parent(Z,Y),female(X),X<>Y.
uncle(X,Y) if parent(Z,Y),brother(X,Z).

しかし、私が質問しようとしているとき

brother(X,james)

X <>Y行の式で自由変数を示しています

brother(X,Y) if male(Y),X<>Y,brother(Y,X).

コードの問題を追跡できません

4

1 に答える 1

1

たぶんあなたはルールを単純化しようとすることができます

brother(X,Y) if male(Y),X<>Y,parent(Z,X),parent(Z,Y).

しかし、male / 2は否定的な用語でのみ定義されているため、これは機能しません。それを機能させるために、私は追加します:

person(X) :- parent(X,_) ; parent(_,X).
male(X) :- person(X), not(female(X)).

これで、male/1は前向きな情報を生成できるようになりました...

(注:テストされていないコード)

person / 1を追加せずに、より適切な方法で編集すると、

/* Y is brother of X */
brother(X,Y) if parent(Z,X), parent(Z,Y), X<>Y, male(Y).
于 2013-01-17T09:15:29.283 に答える