2014-02-15 67 views
0
parent(mel, joan). 
parent(jane, betty). 
parent(jane, tom). 
parent(richard, adam). 
parent(richard, rosa). 
parent(joan, fran). 

例如有人讓我找到父母的所有祖先。我給他的代碼:有沒有辦法在Prolog中註釋參數和返回值?

ancestor(P,C) :- parent(P, C). 
ancestor(P,C) :- ancestor(P,P1), parent(P1, C). 

但我的朋友仍然不知道如何使用謂詞。他稱之爲

ancestor(richard, C)ancestor(C, richard)

有沒有辦法註釋P是參數,而C是返回值?而在一個複雜的情況下,將會有不同名稱的謂詞,我的用戶應該如何知道哪個謂詞是他想要使用的最終謂詞?

回答

1

爲了幫助人類可讀的含義,你可以添加一個額外的謂詞記錄的參數爲可讀名稱/值對:

entry_ancestor_of(ancestor=P, descendent=C) :- 
    ancestor(P,C). 

?- entry_ancestor_of(ancestor=richard, descendent=C). 
C = adam . 

以上,後綴爲* ancestor_of *提示:參數1是參數2的祖先,所以仔細命名謂詞可以使其更清晰。

通常(約定),輸入參數是較早的參數,輸出參數是較晚的參數,但謂詞'雙向工作',即。可以是輸入或輸出,這個規則不能成立。這是您的謂詞的情況:

?- entry_ancestor_of(ancestor=X, descendent=adam). 
X = richard . 

無論是參數可以是輸入或輸出,所以沒有必要編纂/解釋它們的方式,雖然你可能想發表評論,這兩種方式都可以。

我通常會通過在謂詞旁邊的註釋中使用上述兩個用法的示例來評論這些「靈活的」謂詞。

對於入口點標註,只是做一個或多個以下:

  • 明確命名謂詞作爲入口點,如上面的代碼是入口點
  • 安排
  • 使用文檔的意見在同一個物理部分中的入口點與評論 塊說,下面的謂詞是入口點。

編輯:額外的東西重新:編碼準則/其他答案。

  1. Coding guidelines for Prolog,第3.8節,它說:「比如,mother_of(A,B)是不明確的;」,所以我在這給了不錯的建議..也許acapelli的建議將是對更有用。

在該文件中,也看看:

  • 3.5選擇合理的名稱爲輔助謂詞
  • 3.8選擇謂詞的名字,以幫助顯示參數順序
  • 3。13決定謂語名是否應該有一個介紹性的評論進行其經營
  • 4.1開始每謂詞(也許除了輔助謂詞)的類型定義良好的格式

的「?」系統識別,將岬提到的參數類型是第21頁上

+0

那麼你用「entry」前綴來表示「主要功能」? – Gqqnbig

+0

我剛纔用這個例子..絕對不是一個約定。也許入口點應該像capellic所暗示的那樣,而其他'helper'謂詞可以加後綴'_aux或'_loop' - 上面的指導方針也包含了該領域的建議。 – magus

+0

@LoveRight - 請你願意提高(即給予信用)其他答案 - 這兩個都有助於達成這個答案。 – magus

1

一個有用的約定,通過Markus Triska贊助例如,通過加入參數的名字'建立一個謂詞函子 - 在一個廣泛的,適用的意義。您的示例可能是

parent_child(mel, joan). 
... 

ancestor_descendant(P, C) :- parent_child(P, C). 
ancestor_descendant(A, D) :- ancestor_descendant(A, I), parent_child(I, D). 

另外ISO-Prolog和 - 例如SWI-Prolog庫試圖遵循此策略。

例如

atom_codes(Atom, Codes) :- ... 

WRT聲明狀態的參數,一些Prolog的提供報關單 - 例如渦輪Prolog的是,Eclipse,其他...有時這樣的聲明是必需的 - 通常檢查正確性,通常加快計算。

SWI-Prolog提供'剛剛'結構化註釋,IDE自動處理,並且有一個旨在利用運行時檢查來利用這些聲明的contribution

+0

哪些系統知道可選聲明在哪裏加速計算?在DECsystem 10 Prolog中,聲明主要減少了空間消耗。 – false

1

有,帶註釋,和/或有意義的參數名,

% ancestor(?Ancestor, ?Descendent). 
ancestor(P,C) :- parent(P, C). 
ancestor(P,C) :- ancestor(P,P1), parent(P1, C). 

?意味着參數可以用來既作爲輸入(已設置當調用時),或用於輸出(尚未設置當打電話時)。

Prolog(我認爲)推廣的約定是,您將謂詞的名稱放在其第一個參數後面,以獲得預期的參數排序:P「is」ancestorC。大概是「祖先」。但是如果你使用這個名字,那個不熟悉那個約定的人可能會把ancestor_of(P,C)看作是「P的祖先是C」,所以這是一把雙刃劍。

+0

@false這只是我個人對此的看法,並非基於任何人的意見。 –

+0

只是有趣的看看這是如何工作(或不)在英語。 – false

+0

@false我認爲與「的」錯誤的閱讀更自然。沒有它們兩個都感覺相同,所以切換到'A is_pred B'的學習模式更容易。 –

相關問題