2017-04-03 68 views

回答

2

考慮例如:

 
?- X = f(a), 
    copy_term(X, Y), 
    setarg(1, X, b). 
X = Y, Y = f(b). 

相比之下,duplicate_term/2創建真實副本

 
?- X = f(a), 
    duplicate_term(X, Y), 
    setarg(1, X, b). 
X = f(b), 
Y = f(a). 

如果這種差異是在應用程序中存在問題,有可能你的代碼可以通過使用純粹改進的結構更容易出錯。

例如,可以考慮使用歸因變量爲破壞性修改一個較爲聲明選擇,如果你不能沒有 他們。最容易出錯和最普遍的方法通常是始終堅持純粹的方法。如果有必要,拿出乾淨的聲明性接口,並將它們隱藏在 之後。

+0

在SWI-Prolog文檔頁面上也可以找到一些例子。 –

+0

起初它可能絕對看起來不錯並且令人滿意。然而,這也可能會吸引更多人關注這樣的低級構造,因此甚至有助於它們的使用,儘管文檔本身已經強烈建議不要這樣做。就個人而言,我寧願給予沒有這種陷阱的純構造更多的空間,理想上完全避開容易出錯的低級謂詞。作爲「過度表達錯失觀點」的一個例子,請考慮在Prolog教科書中對'!/ 0'的冗長討論:很多文本的頁面,一個複雜的分類,但仍然有很多紅色的'!/ 0'! – mat

+0

不能保證給出的例子符合您的要求。你現在只是觀察那個行爲。 – false