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)).

现在男/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 回答