我使用SWI-Prolog。 这不可能吗?
:- dynamic question/1.
question([do, you, know, what, a, F1, is, ?]).
question([does, F1, have, a, F2, ?]).
.....
?- question([do, you, know, what, a, son, is, ?]), writeln(F1).
F1 = son.
答案 0 :(得分:1)
在Prolog中,当您有谓词子句或事实(或规则)时,任何只出现一次的变量都被视为单例。这意味着Prolog在该子句中没有关于该变量与其他任何内容相关的信息,并且无法在该子句中实例化它。
以下这样的事实有一个单例变量F1
:
question([do, you, know, what, a, F1, is, ?]).
这个事实与F1
无关。因此,查询如:
?- question([do, you, know, what, a, son, is, ?]).
将匹配,从而成功。但是,您的查询中没有变量与事实中的任何内容统一,因此您没有其他结果。同样,F1
和F2
在以下事实中是单例变量:
question([does, F1, have, a, F2, ?]).
解决这种情况的一种方法是将变量隔离在一个单独的参数中,这样它们就不再是单例,而Prolog会在执行查询时将它们统一起来。例如:
question([do, you, know, what, a, F1, is, ?], [F1]).
question([does, F1, have, a, F2, ?], [F1, F2]).
现在,您可以使用自己的变量进行查询,这些变量将与以下事实中的变量统一起来:
?- question([do, you, know, what, a, son, is, ?], [X]).
X = son
当Prolog收到查询时,它与您的第一个事实匹配,第一个参数[do, you, know, what, a, son, is, ?]
与[do, you, know, what, a, F1, is, ?]
统一,[X]
将与[F1]
统一。由于第一次统一会产生F1 = son
,因此您将[X] = [son]
,X = son
。
类似地:
?- question([does, fred, have, a, son, ?], [X, Y]).
X = fred
Y = son
然后查询,例如,问题([做,你,知道,什么,a,儿子,是,?],L)。屈服,L = [儿子]