Prolog教程 3
facts, predicate,
pred(arg1,arg2,…argN).
argument type: interger, atom( low case begin, ’ '), variable(uppoer case begin or _), structure,
事實 (facts)
注:斜粗體字表示Prolog的專有名詞
事實(facts)是prolog中最簡單的謂詞(predicate)。它和關系數據庫中的記錄十分相似。在下一章中我們會把事實作為數據庫來搜索。
謂詞: Prolog語言的基本組成元素,可以是一段程序、一個數據類型或者是一種關系。它由謂詞名和參數組成。兩個名稱相同而參數的數目不同的謂詞是不同的謂詞。
事實的語法結構如下:
pred(arg1, arg2, … argN).
其中pred為謂詞的名稱。arg1,…為參數,共有N個。‘.’是所有的Prolog子句的結束符。沒有參數的謂詞形式如下:
pred.
參數可以是以下四種之一:
整數(integer)
絕對值小于某一個數的正數或負數。
原子(atom)
由小寫字母開頭的字符串。
變量(variable)
由大寫字母或下劃線(_)開頭。
結構(structure)
在以后的章節介紹。
不同的Prolog還增加了一些其他的數據類型,例如浮點數和字符串等。
Prolog字符集包括: 大寫字母,A-Z;小寫字母,a-z;數字,0-9;±//^,.~:.?#$等。
原子通常是字母和數字組成,開頭的字符必須是小寫字母。例如:
hello
twoWordsTogether
x14
為了方便閱讀,可以使用下劃線把單詞分開。例如:
a_long_atom_name
z_23
下面的是不合法的原子,
no-embedded-hyphens
123nodigitsatbeginning
Nocapsfirst
下劃線不能放在最前面
使用單引號擴起來的字符集都是合法的原子。例如:
‘this-hyphen-is-ok’
‘UpperCase’
‘embedded blanks’
下面的由符號組成的也是合法的原子:
,++
變量和原子相似, 但是開頭字符四大寫字母或是下劃線。例如:
X
Input_List
下劃線開頭的都是變量
Z56
有了這些基本的知識,我們就可以開始編寫事實了。事實通常用來儲存程序所需的數據。例如,某次商業買賣中的顧客數據。customer/3。(/3表示customer有三個參數)
customer(‘John Jones’, boston, good_credit).
customer(‘Sally Smith’, chicago, good_credit).
必須使用單引號把顧客名引起來,因為它們是由大寫字母開頭的,并且中間有空格。
再看一個例子,視窗系統使用事實儲存不同的窗口信息。在這個例子中參數有窗口名稱和窗口的位置坐標。
window(main, 2, 2, 20, 72).
window(errors, 15, 40, 20, 78).
某個醫療專家系統可能有如下的疾病數據庫。
disease(plague, infectious). {疾病(瘟疫,有傳染性)}
Prolog的解釋器提供了動態儲存事實和規則的方法,并且也提供了訪問它們的方法。數據庫的更新是通過運行‘consult’或‘reconsult’命令。我們也可以直接在解釋器中輸入謂詞,但是這些謂詞不會被儲存到硬盤上。
尋找Nani
下面我們正式開始“尋找Nani”游戲的編寫。我們從定義基本的事實開始,這些事實是本游戲的基本的數據庫。它們包括:
房間和它們的聯系
物體和它們的位置
物體的屬性
玩家在游戲開始時的位置
“尋找Nani”游戲的的房間格局
首先我們使用room/1謂詞定義房間,一共有五條子句,它們都是事實,如圖2.1。
room(kitchen).
room(office).
room(hall).
room(‘dining room’).
room(cellar).
我們使用具有兩個參數的謂詞來定義物體的位置。第一個參數代表物體的名稱,第二個參數表示物體的位置。開始時,我們加入如下的物體。
location(desk, office).
location(apple, kitchen).
location(flashlight, desk).
location(‘washing machine’, cellar).
location(nani, ‘washing machine’).
location(broccoli, kitchen).
location(crackers, kitchen).
location(computer, office).
注意:我們定義的那些符號,例如:kitchen、desk等對于我們是有意義的,可是它們對于Prolog是沒有任何意義的,完全可以使用任何符號來表示房間的名稱。
謂詞location/2的意思是“第一個參數所代表的物體位于第二個參數所代表的物體中”。Prolog能夠區別location(sink, kitchen)和location(kitchen, sink)。因此,參數的順序是我們定義事實時需要考慮的一個重要問題。
下面我們來表達房間的聯系。使用door/2來表示兩個房間有門相連,這里遇到了一個小小的困難:
door(office, hall).
我們想要表達的意思是,office和hall之間有一個門。可是由于Prolog能夠區分door(office, hall)和door(hall, office), 所以如果我們想要表達一種雙向的聯系,就必須把每種聯系都定義一遍。
door(office, hall).
door(hall, office).
參數的順序對定義物體的位置有幫助,可是在定義房間的聯系時卻帶來了麻煩。我們不得不把每個房門都定義兩次!
在這一章里,只定義單向的門,以后會很好地解決此問題的。
door(office, hall).
door(kitchen, office).
door(hall, ‘dining room’).
door(kitchen, cellar).
door(‘dining room’, kitchen).
下面定義某些物體的屬性,
edible(apple).
edible(crackers).
tastes_yucky(broccoli).
最后,定義手電筒(由于是晚上,玩家必須想找到手電筒,并打開它才能到那些關了燈的房間)的狀態和玩家的初始位置。
turned_off(flashlight).
here(kitchen).
**調試追蹤 trace. (開) notrace(關)
**區分true. true 和false. 沒有句號的true 表示查詢結果還有其他輸出。
總結
以上是生活随笔為你收集整理的Prolog教程 3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 来自一位双非本科跌跌撞撞的秋招指南(秋招
- 下一篇: 无线电模型