在prolog中统一目标列表

在prolog中统一目标列表,prolog,Prolog,我有一个目标列表,我希望在运行时统一这些目标,以便得到一个变量、值对列表。我该怎么做 范例 db.pl: alpha(a). bravo(b). bravo(c). gs([alpha(X), bravo(Y)]). 口译员: ?- [db]. ?- gs(L), solve(L, Out). L = [alpha(X), bravo(Y)]. Out = [[[X, a], [Y, b]], [[X, a], [Y, c]]] (我为向您展示这一点感到非常遗憾,我非常确定您仍然误解了某些观

我有一个目标列表,我希望在运行时统一这些目标,以便得到一个变量、值对列表。我该怎么做

范例

db.pl:

alpha(a).
bravo(b).
bravo(c).
gs([alpha(X), bravo(Y)]).
口译员:

?- [db].
?- gs(L), solve(L, Out).
L = [alpha(X), bravo(Y)].
Out = [[[X, a], [Y, b]], [[X, a], [Y, c]]]
(我为向您展示这一点感到非常遗憾,我非常确定您仍然误解了某些观点。事实上,您最好学习
setof/3
call/N
。但是,我们如何才能获得代表……)

这将给你在SWI

?- gs(L), solve(L, Out).
L = [alpha(_G1760), bravo(_G1765)],
Out = [[[_G1760, a], [_G1765, b]], [[_G1760, a], [_G1765, c]]].

无法直接恢复变量名。您必须自己解析程序。

我看不出这个谓词有多大意义。首先,无法从事实
gs/1
中恢复名称
X
Y
。而且,我看不出你到底想要什么。我希望这不是一个练习。也许你想解释一下你期望它如何工作?我正在尝试构建类似于前向链接的东西,在其中我在运行时评估前置条件,以确定我可以做哪些动作。我需要变量对,以便从post条件定义事实。例如,如果我的先决条件是
alpha(X)
,我的post条件是
bravo(X)
。而
X
a
是统一的,我想定义
bravo(a)
。他从你的第一句话中得到了一个很好的笑声,这是我第一次尝试逻辑编程,它必须显示出来。很难找到像这样令人信服的先进例子。无论如何,这正是我所要求的,所以我把它作为答案。但我想知道,对于具有任意数量变量的目标,是否可以这样做?现在,它只解决术语中的第一个参数,但不适用于具有多个参数(或重复变量)的术语。@dropkick:最终,您可能需要的是一些功能,如toplevel,它显示您回答替换。然而,要开始这项工作,您必须定义很多内容。会很方便,而且
复制\u term/2
。在任何情况下,这些都是元谓词。首先要坚持序言中纯粹、单调的部分。那里有很多东西要学!
?- gs(L), solve(L, Out).
L = [alpha(_G1760), bravo(_G1765)],
Out = [[[_G1760, a], [_G1765, b]], [[_G1760, a], [_G1765, c]]].