Prolog学习笔记100805
//love(zhangxueyou,wanfei). 愛(張學友,王菲). “張學友愛王菲”。
prolog是不允許使用除了基本字符以外字符的。
最末尾的“.”一定不能掉,它表示一個句子結束。
//“:-”在prolog中表示“如果”的意思,我們使用它來定義規則。
lovers(X,Y):-love(X,Y),love(Y,X).某人甲和某人乙是情侶的規則就是:某人甲愛某人乙,并且某人乙愛某人甲。上面用來分隔兩個愛的句子的“,”表示并且的意思。
//提示符號為“?-”詢問,返回yes/no。
?-love(zhangxueyou,wanfei).張學友愛王菲么?解釋器將回答yes。
//“;”是人工輸入的,當解釋器找到一個答案之后,它將這個答案輸出,并且等待用戶的進一步輸入,如果用戶輸入“;”,解釋器將繼續尋找其他的答案,如果輸入的是別的符號,解釋器將終止查詢。
//事實(facts)是prolog中最簡單的謂詞(predicate)。它和關系數據庫中的記錄十分相似。
//謂詞: Prolog語言的基本組成元素,可以是一段程序、一個數據類型或者是一種關系。它由謂詞名和參數組成。兩個名稱相同而參數的數目不同的謂詞是不同的謂詞。?
//事實的語法結構如下:
pred(arg1, arg2, ... argN).
其中pred為謂詞的名稱。arg1,...為參數,共有N個。‘.’是所有的Prolog子句的結束符。沒有參數的謂詞形式如下:
pred.
參數可以是以下四種之一:
整數(integer) 絕對值小于某一個數的正數或負數。
原子(atom) 由小寫字母開頭的字符串(通常是字母和數字組成,開頭的字符必須是小寫字母。使用單引號擴起來也是)。
變量(variable) 由大寫字母或下劃線(_)開頭。變量‘_’是匿名變量。
結構(structure)結構由結構名和一定數量的參數組成,與目標和事實是一樣的。
//Prolog的目標有四個端口用來控制運行的流程:調用(call)、退出(exit)、重試(redo)以及失敗(fail)。一開始使用Call端口進入目標,如果匹配成功就到了exit端口,如果失敗就到了fail端口,如果用戶輸入分號,則又從redo端口進入目標。call 開始使用目標搜尋子句。?
exit 目標匹配成功,在成功的子句上作記號,并綁定變量。?
redo 試圖重新滿足目標,首先釋放變量,并從上次的記號開始搜索。?
fail 表示再找不到更多的滿足目標的子句了。
//在Prolog的解釋器中輸入
?- debug.
就可以開始調試你的程序了。
?
//常用的輸出謂詞。
write/1
此謂詞被調用時永遠是成功的,并且它可以把它的參數作為字符串輸出到屏幕上。當回溯時,它永遠是失敗,所以回溯是不會把已經寫到屏幕上的字符又給刪除的。
nl/0
此謂詞沒有參數,和write一樣,從Call端口調用時總是成功的,從Redo端口回溯時總是失敗的,它的作用是在屏幕上輸出一個回車符。
tab/1
此謂詞的參數是一個整數,它的作用是輸出n個空格,n為它的參數。其控制流程與上面兩個相同。
//fail/0 專門引起回溯的內部謂詞,從它的名字不難看出,它的調用永遠是失敗的。如果fail/0從左邊得到控制權,則它立即把控制權再傳回到左邊。它不會從右邊得到控制,因為沒法通過fail/0把控制權傳到右側。
//輸出列表,結尾不顯示no。
下面我們來編寫list_connections/1,它能夠列出與某個房間相連的所有房間。
list_connections(Place)?
:- connect(Place, X),
tab(2),
write(X),
nl,?
fail.
list_connections(_).
//算術
X is <數學表達式>
變量X將被賦值為表達式的值,在回溯時不賦值。
X >= Y?
X =< Y
//asserta(X)
把子句X當作此子句的謂詞的第一個子句加入到動態數據庫中。它和I/O內部謂詞的流程控制相同。回溯是失敗,并且不會取消它所完成的工作。
//retract(X)
把子句X從動態數據庫中刪除。此操作也是永久性的,也就是說回溯的時候不能撤銷此操作。
//not/1內部謂詞,它的參數是一個目標,如果此目標失敗,則它成功;目標成功則它失敗。
//聯合
變量&任何項目: 變量可以與任何項目綁定,其中也包括變量?
原始項目&原始項目: 兩個原始項目(原子或整數)只有當它們相同時才能聯合。?
結構&結構: 如果兩個結構的每個相應的參數能聯合,那么這兩個結構可以聯合。?
‘=/2’內部謂詞,此謂詞當它的兩個參數能夠聯合時成功,反之則失敗。它的語法如下:
=(arg1, arg2)
為了方便閱讀,也可以寫成如下形式:
arg1 = arg2? 注意:此處的等號在Prolog中的意義與其他語言中的不同。它不是數學運算符或者賦值符。
如果在兩次綁定中變量的值發生沖突,那么目標就失敗了。
如果變量不能綁定為某一可能的值,那么聯合也將失敗。
匿名變量(_)不會綁定為任何值。所以不要求它所出現的位置的值必須相同。
//列表
列表是一組項目的集合,此項目可以是Prolog的任何數據類型,包括結構和列表。列表的元素由方括號括起來,項目中間使用逗號分割。
我們可以使用列表來代替以前的多個子句。例如: loc_list([apple, broccoli, crackers], kitchen).
當某個列表中沒有項目時我們稱之為空表,使用“[]”表示。也可以使用nil來表示。下面的句子表示hall中沒有東西。 loc_list([], hall)
//op/3來定義操作符,它的三個參數分別是:優先權、結合性、操作符名稱。
每個操作符有不同的優先權值,從1到1200。當某句中有多個操作符時,優先權高的將先被考慮。優先權值越小優先權越高。
結合性使用模板來定義,例如中綴操作符使用“xfx”來定義。“f”表示操作符的位置。
當操作符的優先權相同時,Prolog必須決定是從左到右還是從右到左地讀入操作符。這就是操作符的左右結合性。有些操作符沒有結合性,如果你把兩個這種操作符放到一起將產生錯誤。
Infix:?
xfx non-associative (沒有結合性)?
xfy right to left?
yfx left to right?
Prefix?
fx non-associative?
fy left to right?
Postfix:?
xf non-associative?
yf right to left?
為了表示這種嵌套關系,我們可以使用從右到左的結合性。
?- op(35,xfy,is_in).?
//display/1可以看到操作符等的標準的語法結構。
//只有一些特殊的內部謂詞(例如is/2)進行真正的數學運算。is/2計算它右邊表達式的值,并讓左邊綁定為此值。它與聯合(=)謂詞是不同的,=只進行聯合而不進行計算。
總結
以上是生活随笔為你收集整理的Prolog学习笔记100805的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python源码剖析-笔记2
- 下一篇: C中执行指令/程序