2013-11-23 23 views

回答

1

在Prolog中定義符號(被稱爲函子)和它的參數之間謂詞,即關係。

謂詞沒有「返回值」,只是一個「真值」,取決於它是否可以被WRT評論。那麼你的問題很難回答。

當涉及到謂詞時,關聯性,傳遞性和身份幾乎沒有什麼幫助。我們希望評估的第一個也是最常見的屬性是終止,因爲Prolog控制流有點不尋常,並且很容易導致無限遞歸。

無論如何,在列表上的較簡單的二元關係是構件/ 2,保持當其第一個參數是所述第二參數(列表)的元件

member(X, [X|_]). 
member(X, [_|T]) :- member(X,T). 

我看不出任何好處,評估它不是聯想性的,既不是傳遞性的(它的參數是不同類型的!)。

常見操作如intersection,union等通常需要3個參數,其中最後一個是在2個列表之間執行的操作的結果。

Prolog中的身份(即first order logic的實現)值得擔任特殊角色。事實上,用於評估身份的通常編程符號=確實執行(可能)複雜操作,稱爲統一。你可以從(succint)文檔頁面看到,它只是任意條件之間的匹配。

1

你可以做這樣的事情:

% Define sets I want to try 
set7([0,1,2,3,4,5,6]). 

% Define operations 

% Sum modulo 7 
sum7(X, Y, R) :- 
    R is (X+Y) mod 7. 

% Normal sum 
nsum(X, Y, R) :- 
    R is X + Y. 

% A given set is closed if there is not a single case which 
% indicates that it is not closed 

closed(S, Operator) :- 
    \+ n_closed(S, Operator, _), !. 

% This predicate will succeed if it finds one pair of elements 
% from S which, when operated upon, will give a result R which 
% is outside of the set 

n_closed(S, Operator, R) :- 
    member(X, S), 
    member(Y, S), 
    Operation =.. [Operator, X, Y, R], 
    Operation, 
    \+ member(R, S). 

當你執行它,你就會得到這些結果:

| ?- set7(S), closed(S, sum7). 

(1 ms) yes 
| ?- set7(S), closed(S, nsum). 

no 

我不相信我的閉止回閥是最佳的,但它提供了一些如何玩它的想法。

相關問題