2012-03-12 69 views

回答

2

在這兩個示例中,它都被用作中綴運算符,但具有不同的,不相關的含義。

在第一條規則中,你引用它只是一個分隔符,正如Mog已經指出的那樣。 另一種用途,主要用於文檔目的,它是作爲謂詞指示符。很有用,因爲我們可以使用相同的函子具有不同的謂詞。

表達式只是語法sugar用於二元或一元關係,其中函子是操作符。所述意味着這樣的表達式的由上下文中定義:例如,是/ 2照顧表達式的算術評價的:這裏的操作者執行的預期算術運算

?- X is 10/3. 
X = 3.3333333333333335. 

的內置current_op允許檢查運營商定義。嘗試

?- current_op(Precedence,Associativity,/). 
    Precedence = 400, 
    Associativity = yfx . 

我們可以有一個名爲/的謂詞。一個愚蠢的例子:

/(A, B) :- format(A, B). 

或更好

A/B :- format(A, B). 

可以作爲一個速記,我們有許多格式(S)。這種用法是不鼓勵,導致難讀的程序,但給出了這樣的定義,這是一個有效的規則:

?- 'hello ~s'/[world]. 
hello world 
+3

我發現「格式」的例子相當不錯;我想你的意思是不鼓勵使用這個用例的運算符「/」;然而,我認爲當你定義一個新的操作符,比如說「f」,能夠寫出'hello〜s'f [世界]時,它確實相當不錯。總的來說,我認爲編寫(可擴展的)中綴語法的可能性是Prolog難以閱讀像Lisp這樣的語言的巨大優勢。抽象語法樹仍然是完全規則的,並且具體語法對於算術等更方便。雙贏! – mat 2012-03-12 15:16:31

+2

我也認爲,但在SWI-Prolog名單上,我強烈反對它。虐待操作者,這是一種所謂的'手術'疾病:) – CapelliC 2012-03-12 15:39:49

3

那麼,在你的代碼中,它可能只是用作分隔符。它通過統一的服務模式匹配的目的:

A-B = 1-2. 

將返回

A = 1, 
B = 2. 

,因爲我們使用的分隔符-幫助匹配的內容。這裏的分隔符是/

另一個地方,你會看到/1/2很多是當你描述謂語。

somepredicate/arity表示謂詞somepredicate需要arity參數。 例如:

% member/2 : member(?Element, ?List) 
member(Element, [Element|_Tail]). 
member(Element, [_Head|Tail]) :- 
    member(Element, Tail). 

這裏我們的第一行說成員需要2個參數。 在swi-prolog中,此表單也可以用於指定謂詞中的目標謂詞,如listing/1:您可以將其作爲參數maplist/2maplist/3傳遞,結果將會不同。

+0

謝謝你,我覺得你的回答對我很有幫助。 – 2012-03-14 00:57:06

5

X/Y是術語/(X, Y)的中綴語法,即其函子爲「/」的術語,帶有兩個參數:X和Y.在這種情況下可能使用中綴語法,因爲/被定義爲ISO Prolog中的默認運算符。就像a+b是術語+(a, b)的中綴語法,X is Y + Zis(X, +(Y, Z))的中綴語法。

相關問題