1

文件说

copy_term(+Term, -Copy, -Body)制作一个副本,Term其中所有变量都已被新变量替换,这些新变量在新创建的术语之外无处出现。如果Term包含属性变量,Body则与一个术语统一,以便执行Body 将恢复 中变量的等效属性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])])]

我的问题是:如何恢复Bodyover的约束New?我一直找不到具体的例子。

4

2 回答 2

3

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)likecopy_term/2和 on successBody与一个术语相结合,以恢复所涉及的实际约束。本来,Body是可以直接执行的目标。然而,许多采用此接口的系统(如 SWI、YAP)转而使用目标列表。这简化了频繁的操作,因为您的默认值较少,但代价是恢复更加复杂。你需要使用maplist(call,Goals).

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

于 2013-10-29T00:32:05.410 回答
2

这只是 CLPR 中的一个错误,不受支持。我们很久以前就与 CLPR 供应商失去了联系。

于 2013-10-29T17:09:18.663 回答