【问题标题】:Assign variable in list在列表中分配变量
【发布时间】:2019-11-19 16:58:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: list prolog


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 是的,我在考虑谓词,不知道为什么我想到了“范式”。不管怎样,已经是深夜了,也许这就是原因。将编辑帖子并调查您的答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    相关资源
    最近更新 更多