2016-12-04 25 views
5

首先,當我讀到Prolog上的不同謂詞時,例如http_server,它的寫法如下:http_server(:Goal, +Options):+是什麼意思?有時也寫?
其次,有時候我會看到變量聲明爲帶有下劃線的變量,如_Request,即使沒有其他Request,爲什麼?這些在序言中意味着什麼?

回答

7

+-:等印記被稱爲模式聲明。它們描述謂詞參數的預期實例,即是否需要用一個未綁定的變量,實例化的術語等來調用謂詞。這些不是完全標準化的;這裏是約定SWI-Prolog的的描述:http://www.swi-prolog.org/pldoc/man?section=modes

作爲第一個近似值,一個+參數是一個輸入謂詞,你應該提供一個基礎項。一個-參數是一個輸出的謂詞,謂詞將試圖將它與一個術語統一。一個?項可能會在調用時部分實例化,謂詞可能會進一步實例化它。 A :參數是一個元參數,即它是由謂詞調用的目標(例如,在setof/3中)。

http_server(:Goal, +Options)的示例中,應該將第一個參數綁定到一個目標(可能是一個謂詞名)來調用此謂詞。第二個參數必須實例化,大概是在文檔中進一步描述格式的列表。如果你做而不是像這樣調用這個謂詞,例如,如果你傳遞一個未綁定的變量作爲第二個參數,你可能會得到意外的行爲或實例化錯誤。

至於你的第二個問題(最好是單獨的),以下劃線開頭的變量稱爲匿名變量。除了_本身,每個這樣的變量每個子句只能出現一次,這可能會發生多次,並且在每次出現時引用單獨的變量。

對於只發生一次的非匿名變量,Prolog系統通常會發出「單變量變量」警告,因爲這些變量可能是拼寫錯誤或程序員忘記了某些東西的符號。你使用匿名變量來表達「這裏一定有某種東西(例如,一個謂詞參數),但我不在乎它是什麼」的概念。在你的例子中,大概你調用了一個有「請求」參數的謂詞,但是在你的特定用例中你不關心這個請求。

+0

謝謝,非常好的解釋。還有一件事我不明白,爲什麼叫'_Request'而不是'_'?僅僅爲了清楚起見,這是一個請求? – Ferus

+1

是的,這只是爲了讓變量名更有表現力。 –