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

时间:2013-10-28 17:51:11

标签: prolog sicstus-prolog constraint-programming clpfd

文档说明

  

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])])]

我的问题是:如何在Body New之上恢复约束?我找不到具体的例子。

2 个答案:

答案 0 :(得分:3)

copy_term/3是一个相对较新的内置谓词,已于2006年首次在SICStus中引入。它的动机是取代源于1987年SICStus 0.6的语义繁琐的call_residue/2更有效的界面将功能分成两部分:

call_residue_vars(Goal, Vars)call(Goal)类似,并且在成功时将Vars与列表变量(以未指定的顺序)统一,这些变量附加到约束并且已在{{1}中创建或受影响}。

Goalcopy_term(Term, Copy, Body)一样,并且在成功时将copy_term/2与一个术语统一,以恢复所涉及的实际约束。最初,Body是可以直接执行的目标。然而,许多采用此接口的系统(如SWI,YAP)改为使用目标列表。这样可以简化频繁操作,因为您的默认性较低,但代价是恢复更复杂。您需要使用Body

大多数情况下,这两个内置谓词将一起使用。你只使用一个让我有点怀疑的东西。首先需要弄清楚涉及哪些变量,然后才能复制它们。通常,您将使用maplist(call,Goals)。如果您只复制几个变量(如您的例子中),那么您实际上预测这些变量的约束。这可能是您的意图,也可能不是。

答案 1 :(得分:2)

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