文檔說如何在SICStus Prolog中恢復使用copy_term/3收集的約束?
copy_term(+Term, -Copy, -Body)
使得所有 變量已替換出現無處 新創建的項以外的新變量的Term
副本。如果Term
包含歸因於 變量,則將Body
統一爲一個術語,以便執行Body
將恢復Copy
中變量的等效屬性。
我以前肯定數值CLP(R)約束一些變量,並在某些時候我收集這些約束使用copy_term/3。後來,當我嘗試恢復使用「呼叫(身體)」的約束,我在形式[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
?我一直無法找到具體的例子。
@ j4nbur53:我會說:無害。重要的是,如果沒有剩下任何東西,就給出'[]'。 – false
是的。如果你看看call_residue/2的實現(仍然在YAP中),你會看到很多複製。但至少這個「新」界面(10歲以前)成本較低,並保持一定的一致性 - 與舊界面相比。 – false
這裏的界面是約20年SICStus約束經驗的結果。 – false