新手:无法跟踪表达式错误中的自由变量。 Prolog编程

时间:2013-01-17 06:34:53

标签: prolog turbo-prolog

刚开始在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 &lt;&gt; Y的表达式中显示自由变量

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

我无法追踪代码

的问题

1 个答案:

答案 0 :(得分:1)

也许你可以尝试简化规则

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能够产生正面信息......

(注意:未经测试的代码)

编辑更好的方式,无需添加人/ 1,可以是

/* Y is brother of X */
brother(X,Y) if parent(Z,X), parent(Z,Y), X<>Y, male(Y).