2017-07-25 35 views
2

我是Prolog的新手,並逐漸通過Ivan Bratko的「Prolog Programming for Artificial Intelligence」(第4版)。序言:語法正確的對象+關係與結構

做練習時2.1。 (第39頁),我不明白爲什麼5(X,Y)在語法上不正確,而+(north,west)是正確的。起初我認爲它與函子是一個數字(因爲我認爲這可能只是一個原子)有關,但根據這本書,一個原子也可以是一個數字。然後我認爲這是一個與變量有關的問題,但我不明白爲什麼這會對語法正確性造成問題。任何人都可以用正確的方向指出我的解釋嗎?

此外,我想知道關係和結構之間的確切區別是什麼。雖然date(1, may, 2001)(第35頁)被視爲一種結構,但我想知道我們是否可以對第1章早期的例子說同樣的話。例如,第一章中的關係parent(pam,bob)也是所謂的結構,還是上午我混淆的東西?

在此先感謝。

+1

'原子(5)'失敗。所以從技術上講,一個數字不是一個原子。我沒有那本書,所以知道他們聲稱的原因是一個原子也可以是數字*。 – lurker

+1

這也許會有所幫助:[Prolog。結構(複雜的術語)與謂詞,我真的沒有區別](https://stackoverflow.com/questions/28972038/prolog-structurecomplex-term-vs-predicate-i-dont-really-get-the-difference/ 28972664#28972664) – lurker

+0

謝謝!我不知道這樣的謂詞。 – milanv

回答

3

我不明白爲什麼5(X,Y)在句法上不正確,而+(北,西)是正確的。

一個數字不是一個原子,而是一個數字。

在第33個第2.1.1節原子和數字記載:

Atoms can be constructed in three ways: 
1. Strings of letters, digits and the underscore character, 
    starting with a lower-case letter. 
2. Strings of special characters such as + - */< > = : . & _ ~ 
3. Strings of characters enclosed in single quotes. 

字符5

  • 失敗規則1,因爲字符串不以下劃線 字符或更低啓動 - 字母
  • 由於不是規則2而不是一個 的特殊字符
  • 因爲它不是在單引號

字符+成功,因爲規則2是一個特殊字符封閉 失敗規則3。進一步探討這種

一種方式是通過使用SWI-Prolog的functor/3

?- functor(+(north,west),Name,Arity). 
Name = (+), 
Arity = 2. 

?- functor(5(X,Y). 
ERROR: Syntax error: Operator expected 
ERROR: functor(
ERROR: ** here ** 
ERROR: 5(X,Y) . 

準確的區別是什麼關係和結構之間

在第4頁第1.1節定義關係通過事實

通常,關係被定義爲其所有實例的集合。例如,親本(湯姆,鮑勃)親本關係的特定實例。其他情況如下:

parent(pam,bob) 
parent(tom,liz) 
parent(bob,ann) 
parent(bob,pat) 
parent(pat,jim) 

第35頁第2.1節。3層結構

結構化對象(或簡稱結構)是具有幾個組件對象,例如你的問題

date(1, may, 2001) 
point(1,1) 
seg(P1,P2) 
seg(point(1,1),point(2,3)) 
(a + b) * (c - 5)   % uses infix operator 
*(+(a,b),-(c,5))   % uses prefix operator 

尋找讓我覺得你正在尋找雙方的關係和結構,可用於區分一個與其他公共財產。我不知道一個;當我考慮使用Prolog時,我並不認爲should I use a relation or a structure,我認爲how is the data structured它可以像一個數字一樣簡單,或者可以是一個更復雜的結構或結構的結構,然後給出數據。在給出最好的定義時,我可以說的是,一個特定的關係可以由許多具有相同函數的結構組成,但這不是一個在我的腦海裏經過這段時間的想法。

+1

它有點模糊。例如,如果我有兩個事實,即'喜歡(約翰,瑪麗)。和'喜歡(約翰,蘇)','/ 2 /'確實形成了一個關係,即使沒有規則。另外,爲了增加更多的模糊性,add(X,Y,Z): - Z是X + Y.'相當於':-(add(X,Y,Z),(Z是X + Y))'這可以被認爲是*結構*。也許一個*結構*是任何一個關聯數據含義(它使它成爲*關係*?)的複合項。 – lurker

+1

是的,我沒有試圖否定你的答案,只是增加了討論。 – lurker

+0

@ lurker不用擔心。如果我知道大部分答案,我知道評論會指出我缺乏知識的地方,然後我學到了一些東西。請繼續評論,因爲它可以幫助我學習。正如我有這本書的確切版本,我會更深入地研究這一點。 –