Database 在数据库中使用变量

Database 在数据库中使用变量,database,prolog,Database,Prolog,我使用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中,当您有一个谓词子句或事实(或规则)时,任

我使用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

然后是一个问题([do,you,know,what,a,son,is,?),L)。将产生,L=[son]

请注意,
F1
的范围仅限于它出现的子句。因此,查询中的
F1
与事实上的
F1
不同。您需要一些额外的上下文信息来管理它。对于初学者来说,就认为这是不可能的。总的来说,你想达到或做什么?您可以执行类似于,
问题([do,You,know,what,a,F1,is,,[F1])。
问题([does,F1,have,a,F2,,,[F1,F2])。
从而在同一子句中捕获变量名。然后,像<代码>问题([DO,你,知道,A,儿子,IS,],L)。< /代码>将产生,<代码> L=(儿子)< /代码>。@ Lurkk你应该考虑写你的评论作为回答谢谢朋友!“我认为我的版本可以以某种方式获得收益。”鲍里斯我考虑过,但我对OP试图实现的目标非常不确定,所以我不确定这是一个合适的答案。