2013-10-28 30 views
2

文檔說如何在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?我一直無法找到具體的例子。

回答

2

這只是CLPR中的一個錯誤,它不受支持。很久以前我們與CLPR供應商失去了聯繫。

3

copy_term/3是一個相對較新的內置謂詞,已在SICStus被首次介紹了2006年它的動機是爲了取代笨重的語義其中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。如果你只複製一些變量(如你的例子),你實際上是預測這些變量的約束。這可能是也可能不是你的意圖。

+0

@ j4nbur53:我會說:無害。重要的是,如果沒有剩下任何東西,就給出'[]'。 – false

+0

是的。如果你看看call_residue/2的實現(仍然在YAP中),你會看到很多複製。但至少這個「新」界面(10歲以前)成本較低,並保持一定的一致性 - 與舊界面相比。 – false

+0

這裏的界面是約20年SICStus約束經驗的結果。 – false