的问题是什么
刚开始用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).
我无法追踪代码
也许你可以试着简化规则
brother(X,Y) if male(Y),X<>Y,parent(Z,X),parent(Z,Y).
,但这是行不通的,因为男性/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).