[英]Steadfastness: Definition and its relation to logical purity and termination
到目前為止,我一直堅持 Prolog程序意味着:
如果對於一個查詢
Q
,有一個subtermS
,這樣有一個長期T
,讓?- S=T, Q.
雖然成功?- Q, S=T.
失敗 ,然后由Q
調用的謂詞之一不是堅定的。
直覺上,我因此堅定地表示我們不能使用實例化來“欺騙”謂詞來提供解決方案,否則這些解決方案不僅不會被給予,而是被拒絕 。 注意非終止程序的區別!
特別是,至少在我看來, 邏輯純度總是意味着堅定不移。
例子 。 為了更好地理解堅定性的概念,考慮這個屬性的幾乎經典的反例,在將高級學生引入Prolog的操作方面時經常引用,使用兩個整數之間關系的錯誤定義及其最大值:
integer_integer_maximum(X, Y, Y) :- Y >= X, !. integer_integer_maximum(X, _, X).
這個中的一個明顯錯誤 - 我們應該說“ 搖擺不定 ” - 定義當然是以下查詢錯誤地成功:
?- M = 0, integer_integer_maximum(0, 1, M). M = 0. % wrong!
而交換目標產生了正確的答案:
?- integer_integer_maximum(0, 1, M), M = 0. false.
這個問題的一個很好的解決方案是依靠純方法來描述關系,例如:
integer_integer_maximum(X, Y, M) :- M #= max(X, Y).
這在兩種情況下都能正常工作,甚至可以在更多情況下使用:
?- integer_integer_maximum(0, 1, M), M = 0. false. ?- M = 0, integer_integer_maximum(0, 1, M). false. | ?- X in 0..2, Y in 3..4, integer_integer_maximum(X, Y, M). X in 0..2, Y in 3..4, M in 3..4 ? ; no
現在由Covington等人撰寫的Prolog編寫指南,由理論家的發明者 Richard O'Keefe共同撰寫,包含以下部分:
5.1謂詞必須堅定不移。
任何體面的謂詞必須是“堅定的”,即如果其輸出變量已經恰好被實例化為輸出值,則必須正常工作(O'Keefe 1990)。
那是,
?- foo(X), X = x.
和
?- foo(x).
必須在完全相同的條件下成功並具有相同的副作用。 不這樣做只能用於輔助謂詞,其調用模式受主謂詞的強烈約束。
因此,引用文章中給出的定義比我上面所述的定義要嚴格得多。
例如,考慮純 Prolog程序:
nat(s(X)) :- nat(X). nat(0).
現在我們處於以下情況:
?- nat(0). true. ?- nat(X), X = 0. nontermination
這顯然違反了在完全相同條件下成功的屬性,因為其中一個查詢根本不再成功 。
因此我的問題是:我們是否應該稱上述計划不堅定? 請證明你的答案,並在現有文獻中解釋堅定性及其定義背后的意圖,與邏輯純度的關系以及相關的終止概念。
在“The prolog”第96頁中,Richard O'Keef說'即使查詢具有意外形式(通常為我們通常認為的輸入值提供值),我們也稱拒絕給出錯誤答案的屬性'堅定'
*我不確定這是否應該是輸出。 即在您的查詢中?- M = 0, integer_integer_maximum(0, 1, M). M = 0. % wrong!
?- M = 0, integer_integer_maximum(0, 1, M). M = 0. % wrong!
M用作輸入,但該子句被設計為輸出。
在nat(X), X = 0.
我們使用X作為輸出變量而不是輸入變量,但它沒有給出錯誤的答案,因為它沒有給出任何答案。 所以我認為根據這個定義,它可以是堅定的。
他給出的經驗法則是“推遲輸出統一直到削減后”。 在這里,我們沒有削減,但我們仍然想推遲統一。
但是我認為首先使用基本情況而不是遞歸情況是明智的,因此nat(X), X = 0.
最初會成功..但是你仍然會有其他問題..
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.