文档说明
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
之上恢复约束?我找不到具体的例子。
答案 0 :(得分:3)
copy_term/3
是一个相对较新的内置谓词,已于2006年首次在SICStus中引入。它的动机是取代源于1987年SICStus 0.6的语义繁琐的call_residue/2
更有效的界面将功能分成两部分:
call_residue_vars(Goal, Vars)
与call(Goal)
类似,并且在成功时将Vars
与列表变量(以未指定的顺序)统一,这些变量附加到约束并且已在{{1}中创建或受影响}。
Goal
与copy_term(Term, Copy, Body)
一样,并且在成功时将copy_term/2
与一个术语统一,以恢复所涉及的实际约束。最初,Body
是可以直接执行的目标。然而,许多采用此接口的系统(如SWI,YAP)改为使用目标列表。这样可以简化频繁操作,因为您的默认性较低,但代价是恢复更复杂。您需要使用Body
。
大多数情况下,这两个内置谓词将一起使用。你只使用一个让我有点怀疑的东西。首先需要弄清楚涉及哪些变量,然后才能复制它们。通常,您将使用maplist(call,Goals)
。如果您只复制几个变量(如您的例子中),那么您实际上预测这些变量的约束。这可能是您的意图,也可能不是。
答案 1 :(得分:2)
这只是CLPR中的一个错误,不支持。很久以前,我们与CLPR供应商失去了联系。