[英]What's the difference between functor, a fact, a predicate and a rule in Prolog?
我想知道這些術語之間的區別:
在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/2
和male/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)
如果您來自數學邏輯,您可能會發現將謂詞定義為布爾值函數(即將其參數映射為true或false的函數)會很有幫助。 因此謂詞是關系的特征函數(參見謂詞(數學邏輯) 。因為你可以查詢事實並得到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/1
, setof/3
等)可以將術語(functor / arity)解釋為謂詞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.