繁体   English   中英

在数据库中使用变量

[英]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, ?]).

将匹配并因此成功。 但是,您的查询中没有任何变量可以与事实相统一,因此您没有其他结果。 同样,在以下事实中, F1F2是单例变量:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM