gpt4 book ai didi

prolog - 如何在 SICStus Prolog 中恢复使用 copy_term/3 收集的约束?

转载 作者:行者123 更新时间:2023-12-02 01:50:40 25 4
gpt4 key购买 nike

文档说的是

copy_term(+Term, -Copy, -Body) makes a copy of Term in which all variables have been replaced by new variables that occur nowhere outside the newly created term. If Term contains attributed variables, Body is unified with a term such that executing Body will reinstate equivalent attributes on the variables in Copy.

我之前确认了对某些变量的数值 CLP(R) 约束,并且在某些时候我使用 copy_term/3 收集这些约束。后来,当我尝试使用“call(Body)”恢复约束时,我在 [nfr:resubmit_eq(...)] 形式的参数中收到“实例化错误”

这是一个演示该问题的简化示例:

:-use_module(library(clpr)).
{Old>=0, A>=0,A=<10, NR= Old+Z, Z=Old*(A/D)}, copy_term(Old,New,CTR), call(CTR).

结果:

Instantiation error in argument 1 of '.'/2
! goal: [nfr:resubmit_eq([v(-1.0,[_90^ -1,_95^1,_100^1]),v(1.0,[_113^1])])]

我的问题是:如何通过 New 恢复 Body 中的约束?我还没找到具体的例子。

最佳答案

copy_term/3 是一个相对较新的内置谓词,大约于 2006 年在 SICStus 中首次引入。其动机是取代语义上麻烦的 call_residue/2它源自 1987 年的 SICStus 0.6,它具有更清晰、更高效的界面,将功能一分为二:

call_residue_vars(Goal, Vars)call(Goal) 类似,成功后将 Vars 与列表变量(按未指定的顺序)统一)附加到约束并已在Goal中创建或影响。

copy_term(Term, Copy, Body) 就像 copy_term/2 一样,成功后将 Body 与一个术语统一起来,以恢复所涉及的实际约束。本来,Body是一个可以直接执行的目标。然而,许多采用此界面的系统(如 SWI、YAP)转而使用目标列表。这简化了频繁的操作,因为您的违约率较低,但代价是使恢复变得更加复杂。您需要使用maplist(call,Goals)

大多数时候,这两个内置谓词会一起使用。你只使用一个,这让我有点怀疑。首先需要弄清楚涉及到哪些变量,然后才能复制它们。通常,您将使用 call_residue_vars/2 来实现此目的。如果您仅复制几个变量(如您的示例中所示),那么您实际上是在投影对这些变量的约束。这可能是也可能不是您的意图。

关于prolog - 如何在 SICStus Prolog 中恢复使用 copy_term/3 收集的约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19641694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com