2011-11-19 64 views
7

我一直在試圖學習Prolog,並且完全沉迷於謂詞s()所做的事情。 我看到它經常被使用,並且互聯網上關於Prolog的資源如此之少以至於我找不到答案。s()謂詞在Prolog中做什麼?

Ex。

/* sum(Is,S) is true if S is the sum of the list of integers Is.   */ 
    sum([],0). 
    sum([0|Is],S):-sum(Is,S). 
    sum([s(I)|Is], s(Z)):-sum([I|Is],Z). 
+0

你使用的是什麼版本的prolog解釋器? –

+0

我使用:SWI-Prolog版本5.10.1 for amd64 – okin33

回答

14

s/1本身並沒有做任何事情,它也不是一個真正的謂詞。它們只是術語,是他們論證繼承者的代表。因此,s(0)用於表示0(即1)的後繼,s(s(0))用於表示s(0)的後繼(即2)等等。它們在Prolog中非常普遍,因爲Prolog是執行符號計算的很好的語言,但即使是簡單的算術運算也感覺笨重,這意味着它們不能與編程範例無縫集成。

+8

很好地說,+ s(0)XD –

+1

這很好地解釋了爲什麼我的程序使用s/1的輸出很奇怪。非常感謝你,很好的解釋! – okin33

1

s/1代表繼任者。它用於以邏輯上可訪問的方式表示數字。

+1

非常感謝你!但是,當我嘗試運行一個使用s/1的程序計數時,我得到了以下形式的奇怪輸出: ? - mycount(a,[a,a],N)。 N = s(s(0)); N = s(0); N = s(0); N = 0; 錯誤。 – okin33

0

這是Prolog實現特定的。它指的是後繼謂詞,參見this獲取更多信息

+1

's(X)'不是實現特定的。這是一個任意的函子。在它的位置嘗試't(X)'或'succ(X)'。 – false