我看到在代碼中使用這樣的斜線:有時候我不知道什麼是「/」,在序言
solution([X/Y|Others]) :-
noattack(X/Y, Others).
但後來有時候我看到「/ 1」「/ 2」等在序言。
這些陳述(字符)是什麼意思?
我看到在代碼中使用這樣的斜線:有時候我不知道什麼是「/」,在序言
solution([X/Y|Others]) :-
noattack(X/Y, Others).
但後來有時候我看到「/ 1」「/ 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
那麼,在你的代碼中,它可能只是用作分隔符。它通過統一的服務模式匹配的目的:
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/2
或maplist/3
傳遞,結果將會不同。
謝謝你,我覺得你的回答對我很有幫助。 – 2012-03-14 00:57:06
X/Y
是術語/(X, Y)
的中綴語法,即其函子爲「/」的術語,帶有兩個參數:X和Y.在這種情況下可能使用中綴語法,因爲/被定義爲ISO Prolog中的默認運算符。就像a+b
是術語+(a, b)
的中綴語法,X is Y + Z
是is(X, +(Y, Z))
的中綴語法。
我發現「格式」的例子相當不錯;我想你的意思是不鼓勵使用這個用例的運算符「/」;然而,我認爲當你定義一個新的操作符,比如說「f」,能夠寫出'hello〜s'f [世界]時,它確實相當不錯。總的來說,我認爲編寫(可擴展的)中綴語法的可能性是Prolog難以閱讀像Lisp這樣的語言的巨大優勢。抽象語法樹仍然是完全規則的,並且具體語法對於算術等更方便。雙贏! – mat 2012-03-12 15:16:31
我也認爲,但在SWI-Prolog名單上,我強烈反對它。虐待操作者,這是一種所謂的'手術'疾病:) – CapelliC 2012-03-12 15:39:49