规则头中的Prolog单例变量使程序为所有查询输出布尔值

规则头中的Prolog单例变量使程序为所有查询输出布尔值,prolog,Prolog,我有一个prolog程序 红色(玫瑰色)。 红色(红掌)。 白色(玫瑰色)。 白色(栀子花)。 白色(茉莉花)。 比如(Y,X):- 红色(X),!, 失败 ; 白色(X)。 下面是它如何响应不同的查询 ?-像(玫瑰、栀子花)。 对。 -像(罗斯,P)。 错。 -类似(缬草、红掌)。 错。 -像(罗斯,X)。 假的 我现在的问题是: 当在查询中使用变量进行查询时(例如:?-like(rose,X)。),Prolog通常通过返回一个值来响应(类似于X=some_val)。为什么我没有得到这些变

我有一个prolog程序

红色(玫瑰色)。
红色(红掌)。
白色(玫瑰色)。
白色(栀子花)。
白色(茉莉花)。
比如(Y,X):-
红色(X),!,
失败
;
白色(X)。
下面是它如何响应不同的查询

?-像(玫瑰、栀子花)。
对。
-像(罗斯,P)。
错。
-类似(缬草、红掌)。
错。
-像(罗斯,X)。
假的
我现在的问题是:

当在查询中使用变量进行查询时(例如:
?-like(rose,X)。
),Prolog通常通过返回一个值来响应(类似于
X=some_val
)。为什么我没有得到这些变量的任何值,而是
true
false


非常感谢所有有用的答案。提前感谢。

想想Prolog在这里做什么:

like(rose,p)
如果
red(p)
,则成功,因此它抓住了
p
的可能替代品,即
rose
anthurium
。然后它遍历
cut
,然后它遍历
fail
s。但“失败”意味着该路径下的验证搜索没有带来任何解决方案,也没有要报告的成功绑定(从失败的分支中获取信息的唯一失败是对日志文件产生副作用,并在以后进行读取检查)。事实上,所有绑定都将在回溯时撤消。第二个分支是
white(X)
,但是
rose
不是白色的,所以我们在这里也失败了

你也可以写:

like(_,X) :- \+ red(X).
like(_,X) :- white(X).
更具可读性。我们注意到,当调用类似(X,X)的
时,作为failure操作符
\+
的否定所包含的目标是非圆形的。这是不好的,会导致查询陷入困境(换句话说,不要这样做)。我已经在上面写了这一页