[英]Using variables in a database
我使用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.
在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
然后是一个查询,例如question([do,you,know,what,a,son,is,?],L)。 将产生,L = [儿子]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.