簡體   English   中英

在Prolog中,函子,事實,謂詞和規則之間有什么區別?

[英]What's the difference between functor, a fact, a predicate and a rule in Prolog?

我想知道這些術語之間的區別:

  1. 事實
  2. 函子
  3. 謂語。
  4. 規則

在Prolog。

如果我寫: brother(john, jack).
那是事實嗎? 還是謂詞?

要解決您給出的示例:

brother(john, jack).
   ^      ^     ^
functor   |     |
      argument  |
            argument
\________  ________/
         \/
   fact/predicate

brother/2也是一個謂詞和事實(參見3. GuyCoder引用標准中的3.72事實 ),因為你可以把它寫成一個包含單個目標為true正文的子句:

brother(john, jack) :-  % <- head of the clause
   true.                % <- body of the clause

你的例子中的謂詞brother有兩個參數,因此arity 2被稱為brother / 2 (參見@ GuyCoder帖子中的3.129謂詞 )。 謂詞brother / 2的名稱或標識符也稱為謂詞的函子(參見3.77仿函數 ;請注意3.77和3.129使用相同的定義)。 您可以將事實視為一種特殊的謂詞,您可以在沒有規則的情況下進行定義。

如果您有一些事實parent_of/2male/2並根據這些確定了謂詞brother_of/2 ,例如..

brother_of(X,Y) :-           % X is brother of Y if
   dif(X,Y),                 % X and Y are different AND
   male(X),                  % X is male AND
   parent_of(P,X),           % X has a parent P AND
   parent_of(P,Y).           % Y has the same parent P

...然后上面的定義構成一個規則,因為該條款的主體不是true的目標(見3.154規則 )。 上述規則包括以下部分:

brother_of(X,Y) :-     % head of the rule
   dif(X,Y),           % goal  \
   male(X),            % goal   \  body of
   parent_of(P,X),     % goal   /  the rule
   parent_of(P,Y).     % goal  /

規則的頭部后面跟着:-這是一個指向規則頭部的蘊涵箭頭,目標被分開,這是一個邏輯AND(連接)。 因此,規則的主體由單個目標或目標的結合組成,規則的主體意味着規則的頭部。 因此,您可以將上面的brother_of / 2定義讀作邏輯公式:

brother_of(X,Y)dif(X,Y)male(X) parent_of(P,X) parent_of(P,Y)

如果您來自數學邏輯,您可能會發現將謂詞定義為布爾值函數(即將其參數映射為truefalse的函數)會很有幫助。 因此謂詞是關系的特征函數(參見謂詞(數學邏輯) 。因為你可以查詢事實並得到true / false作為答案,它們構成謂詞。當你查詢兄弟/ 2的定義時,你可以觀察到這一點:

?- brother(john,jack).
true.                      % <- maps to true

?- brother(john,jason).
false.                     % <- maps to false

如果使用變量發出查詢,則會獲得使謂詞為真而不是答案為true所述變量的替換,例如:

?- brother(X,Y).
X = john,                  % these substitutions for X and Y
Y = jack.                  % map to true

最后一點:在談論Prolog時,術語謂詞關系通常可以互換使用,考慮將謂詞編寫描述關系是非常有幫助的(參見上面brother_of / 2定義中的注釋)。 因此,對於上述查詢,也可以說:關系brother(john,jack) 成立 關系brother(john,jason) 不成立 關系brother(X,Y) 適用於替換 X=john Y=jack

ISO / IEC 13211-1第一版1995-06-01
信息技術 - 編程語言 - Prolog -
第1部分:
一般核心

3.9 arity :復合詞的參數個數。 語法上,與仿函數或謂詞相關聯的非負整數。

3.19 body :一個目標,以其作為規則一部分的背景來區分(見3.154)。

3.32 條款 :事實或規則。 它有兩個部分:頭部和身體。

3.37 復合詞 :一個N,N正的算子,以及一系列N個參數。

3.72 事實 :一個以身體為目標的條款。
注 - 事實可以在Prolog文本中用一個術語來表示,該術語的主要函子既不是(:-)/1也不是(:-)/2

3.77仿函數 :一個標識符和一個arity。

3.81 目標 :要執行的預測(參見正文,查詢和7.7.3)。

3.84 (規則):預測,以其背景來區分。

3.88 identifier :用於表示原子,仿函數名稱或謂詞名稱的基本非結構化對象。

3.129 謂詞 :一個標識符和一個arity。

3.133 predication :具有arity N和n個參數序列的謂詞。

3.143 query :作為頂層的交互式輸入給出的目標。

3.154 rule :一個主體不是目標的子句。 在執行期間,如果正文對於某些替換是正確的,則對於該替換,頭部也是如此。 規則在Prolog文本中由一個術語表示,其主要函子是(:-)/2 ,其中第一個參數轉換為頭部,第二個參數轉換為正文。

brother(john, jack). 是事實。

事實是謂詞表達式,它對問題域進行聲明性陳述。

likes(john, mary). 

規則是一個謂詞表達式,它使用邏輯蘊涵(:-)來描述事實之間的關系。 規則可以是

left :- right.
friends(X,Y) :- likes(X,Y),likes(Y,X).

事實和規則都是謂詞。

所以對於你的問題,兄弟(約翰,傑克)是一個事實。

術語謂詞 (或目標 )之間的差異可能很微妙。 它們看起來一樣,並且因環境而異。 例如:

foo(1).
foo(2).
foo_results(Results) :- setof(X, foo(X), Results).
?- foo_results(Results).
Results = [1, 2].

謂詞 foo/1有兩個子句。 謂詞foo_results/1調用它,但是間接地... setof/3元謂詞將一個術語作為它的第二個參數,它將其解釋為謂詞。 換句話說,仿函數(name / arity)是一種術語的骨架; 一些元謂詞(例如, call/1setof/3等)可以將術語(functor / arity)解釋為謂詞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM