首页 > 解决方案 > 在列表中分配变量

问题描述

我对 Prolog 列表有疑问。假设我有这个谓词: array(p, [A,B,C]). 当我这样做时: array(p,X). 我得到:X = [_,_,_]

现在,考虑到我有这个谓词: p1(1) :- array(p1, [1,B1,C1]). 我期望得到: X = [1,_,_]

但相反,结果与以前相同。在 Prolog 中甚至可能发生这样的事情吗?另一个问题是,如果我们能以某种方式设置这些值,我们能否以同样的方式覆盖这些值?我知道在序言中变量只分配一次,但我想以某种方式获得一个动态列表。

标签: listprolog

解决方案


我不确定你所说的“范式”是什么意思,我也不清楚你想用这段代码做什么。如果你在顶层有这个:

array(p, [A,B,C]).

您正在定义一个 fact array/2,它p与三个未实例化变量的列表相关联。您的第一个查询相当于检索此事实。

您的第二个“范式”实际上是规则或谓词的定义p1/1,它采用单个参数,该参数必须为 1 才能触发规则。第二个谓词的主体是对肯定会失败的谓词array/2调用。我看不出你怎么可能得到和以前一样的结果,因为你之前定义array(p, ...)过,现在你正在寻找array(p1, ...). 此外,X在您的第二个查询中没有 no ,因此没有理由X出现在结果中,而且肯定不会出现,即使您调用了array(p, ...)而不是array(p1, ...).

我认为您在这里尝试做的可能是设置某种由三个变量组成的集合,然后在进行一些计算时依次统一它们中的每一个。在 Prolog 中做这样的事情是可能和容易的,但事实数据库不会真正参与这个过程。您将不得不编写将变量传递给其他谓词的谓词,这些谓词将统一它们并将它们返回绑定。这些都不是很难,但看起来你将不得不回去更好地理解这里的基础知识。你在这里离题太远了,我认为没有人能真正回答你所说的问题,因为它有太多的困惑。


推荐阅读