Prolog原子匹配与合一疑惑:UGC NET 2015真题答案辨析
Prolog UGC NET 2015真题答案解析:father(X,Y)匹配数是2还是0?
我只掌握Prolog基础内容,练习UGC NET 2015年真题时,对father(X,Y)的答案应该是2还是0存在困惑。我理解答案是2,因为变量X匹配了Alice和Thomas,尽管最终没有匹配输出。
题目代码如下:
father(X, Y) :- parent(X, Y), male(X). parent(Sally, Bob). parent(Jim, Bob). parent(Alice, Jane). parent(Thomas, Jane). male(Bob). male(Jim). female(Salley). % 注意:此处存在拼写错误,应为Sally female(Alice).
核心解析
你混淆了parent(X,Y)的匹配结果和father(X,Y)的触发条件:
father(X,Y)的成立必须同时满足两个规则:parent(X,Y)为真 且male(X)为真,二者缺一不可。- 针对你提到的Alice和Thomas:
- Alice:
parent(Alice,Jane)是成立的,但代码明确定义了female(Alice),所以male(Alice)为假,father(Alice,Jane)不成立。 - Thomas:
parent(Thomas,Jane)成立,但代码里完全没有定义Thomas的性别(既没有male(Thomas)也没有female(Thomas)),Prolog中未声明的谓词默认判定为假,因此male(Thomas)不成立,father(Thomas,Jane)也不成立。
- Alice:
- 整个代码里,只有
father(Jim,Bob)是唯一满足两个条件的实例(parent(Jim,Bob)+male(Jim)均为真)。
如果题目是查询father(X,Jane)的成功匹配数,答案是0;你误以为是2,是只考虑了parent(X,Jane)的匹配结果,忽略了father规则要求的male(X)必要条件。
代码里的额外问题
- 存在拼写错误:
female(Salley)应该改成female(Sally),不过这对Alice和Thomas的判断没有影响。 - 缺少
male(Thomas)的定义,这是导致Thomas无法满足father条件的直接原因。
内容的提问来源于stack exchange,提问作者TestStart
相关产品推荐
相关产品推荐

