如何在prolog中将一个列表分配给变量?

如何在prolog中将一个列表分配给变量?,prolog,Prolog,我想附加([],C,C),其中C是包含一些元素的列表。可能吗?如果其他条件为true,我将在C中附加一些包含元素append(find,C,C)的列表。 我还想把C中的最终值存储到变量D中。我该怎么做 我想附加([],C,C),其中C是包含一些元素的列表。可能吗 append([],C,C)始终为真。一个空的列表加上任何东西就是任何东西。看看Prolog在您尝试时说了什么: ?- append([],C,C). true. 没有任何绑定的true告诉您Prolog建立了证明,但没有创建新的绑定

我想附加([],C,C),其中C是包含一些元素的列表。可能吗?如果其他条件为true,我将在C中附加一些包含元素append(find,C,C)的列表。 我还想把C中的最终值存储到变量D中。我该怎么做

我想附加([],C,C),其中C是包含一些元素的列表。可能吗

append([],C,C)
始终为真。一个空的列表加上任何东西就是任何东西。看看Prolog在您尝试时说了什么:

?- append([],C,C).
true.
没有任何绑定的
true
告诉您Prolog建立了证明,但没有创建新的绑定。此代码将产生相同的结果:

meaningless(_, _, _).

?- meaningless(everybody, X, Squant).
true.
这表明你的愿望是错误的<代码>附加([],C,C)不会做您认为它会做的事情

如果其他条件为true,我将在C中附加一些包含元素append(find,C,C)的列表。我还想把C中的最终值存储到变量D中,我该怎么做呢

从“存储”和其他隐含可变状态的操作的角度来考虑,这肯定表明您不理解Prolog。在Prolog中,您可以建立绑定(或者将事实断言到动态存储中,这对于初学者来说是一个焦油坑)。通过这样做,可以在序言中实现类似的功能:

frob(cat, List, Result) :- append([cat], List, Result).
frob(dog, List, List).
这个谓词
frob/3
有两个in参数:一个atom和一个list。如果原子是
cat
,则它会将
[cat]
附加到列表的开头。在子句头中的参数和它们在子句体中的使用之间的线程是Prolog如何管理状态的。基本上,Prolog中的所有状态要么在调用堆栈中,要么在动态存储中

在Python中给出一个例子,考虑这两种实现阶乘的方法:

def fac(n):
  result = 1
  while n > 1:
    result = result * n
    n = n - 1
这个版本有一个变量,
result
,它是一种状态。我们在循环中反复改变状态以实现计算。虽然阶乘函数可以定义为fac(n)=n*fac(n-1),但该实现没有明确地将fac(n-1)隐藏在代码中的任何地方

递归方法是:

def fac(n):
  if n < 1: 
    return 1
  else: 
    return n * fac(n-1)
这里发生的事情似乎是Prolog可以告诉我们,因为列表不是以
cat
开头的,所以它能够推断X是
dog
。好的Prolog程序员渴望在他们的API中保持这种幻觉,但这里真正发生的事情是Prolog进入了第一条规则,它扩展到了
append([cat],X,[whale])
,然后统一失败了,因为Prolog无法产生一个X,而这个X在它前面加了
[cat]
,将生成
[whale]
。因此,它进入了第二条规则,该规则将X与
dog
统一起来,并将后两个参数彼此统一起来。因此
Y=[whale]


我希望这有帮助!

uhh…统一?
append([],C,C)
C
附加到
[]
的末尾是
C
,如果
C
是任何列表,这总是正确的。所以你问的有点不清楚。
?- frob(X, Y, [whale]).
X = dog,
Y = [whale].