日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Prolog学习笔记100805

發(fā)布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Prolog学习笔记100805 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

//love(zhangxueyou,wanfei). 愛(張學友,王菲). “張學友愛王菲”。
prolog是不允許使用除了基本字符以外字符的。
最末尾的“.”一定不能掉,它表示一個句子結(jié)束。

//“:-”在prolog中表示“如果”的意思,我們使用它來定義規(guī)則。
lovers(X,Y):-love(X,Y),love(Y,X).某人甲和某人乙是情侶的規(guī)則就是:某人甲愛某人乙,并且某人乙愛某人甲。上面用來分隔兩個愛的句子的“,”表示并且的意思。

//提示符號為“?-”詢問,返回yes/no。
?-love(zhangxueyou,wanfei).張學友愛王菲么?解釋器將回答yes。

//“;”是人工輸入的,當解釋器找到一個答案之后,它將這個答案輸出,并且等待用戶的進一步輸入,如果用戶輸入“;”,解釋器將繼續(xù)尋找其他的答案,如果輸入的是別的符號,解釋器將終止查詢。

//事實(facts)是prolog中最簡單的謂詞(predicate)。它和關(guān)系數(shù)據(jù)庫中的記錄十分相似。

//謂詞: Prolog語言的基本組成元素,可以是一段程序、一個數(shù)據(jù)類型或者是一種關(guān)系。它由謂詞名和參數(shù)組成。兩個名稱相同而參數(shù)的數(shù)目不同的謂詞是不同的謂詞。?

//事實的語法結(jié)構(gòu)如下:
pred(arg1, arg2, ... argN).
其中pred為謂詞的名稱。arg1,...為參數(shù),共有N個。‘.’是所有的Prolog子句的結(jié)束符。沒有參數(shù)的謂詞形式如下:
pred.
參數(shù)可以是以下四種之一:
整數(shù)(integer) 絕對值小于某一個數(shù)的正數(shù)或負數(shù)。
原子(atom) 由小寫字母開頭的字符串(通常是字母和數(shù)字組成,開頭的字符必須是小寫字母。使用單引號擴起來也是)。
變量(variable) 由大寫字母或下劃線(_)開頭。變量‘_’是匿名變量。
結(jié)構(gòu)(structure)結(jié)構(gòu)由結(jié)構(gòu)名和一定數(shù)量的參數(shù)組成,與目標和事實是一樣的。

//Prolog的目標有四個端口用來控制運行的流程:調(diào)用(call)、退出(exit)、重試(redo)以及失敗(fail)。一開始使用Call端口進入目標,如果匹配成功就到了exit端口,如果失敗就到了fail端口,如果用戶輸入分號,則又從redo端口進入目標。call 開始使用目標搜尋子句。?
exit 目標匹配成功,在成功的子句上作記號,并綁定變量。?
redo 試圖重新滿足目標,首先釋放變量,并從上次的記號開始搜索。?
fail 表示再找不到更多的滿足目標的子句了。

//在Prolog的解釋器中輸入
?- debug.
就可以開始調(diào)試你的程序了。
?
//常用的輸出謂詞。
write/1
此謂詞被調(diào)用時永遠是成功的,并且它可以把它的參數(shù)作為字符串輸出到屏幕上。當回溯時,它永遠是失敗,所以回溯是不會把已經(jīng)寫到屏幕上的字符又給刪除的。
nl/0
此謂詞沒有參數(shù),和write一樣,從Call端口調(diào)用時總是成功的,從Redo端口回溯時總是失敗的,它的作用是在屏幕上輸出一個回車符。
tab/1
此謂詞的參數(shù)是一個整數(shù),它的作用是輸出n個空格,n為它的參數(shù)。其控制流程與上面兩個相同。

//fail/0 專門引起回溯的內(nèi)部謂詞,從它的名字不難看出,它的調(diào)用永遠是失敗的。如果fail/0從左邊得到控制權(quán),則它立即把控制權(quán)再傳回到左邊。它不會從右邊得到控制,因為沒法通過fail/0把控制權(quán)傳到右側(cè)。

//輸出列表,結(jié)尾不顯示no。
下面我們來編寫list_connections/1,它能夠列出與某個房間相連的所有房間。
list_connections(Place)?
:- connect(Place, X),
tab(2),
write(X),
nl,?
fail.
list_connections(_).

//算術(shù)
X is <數(shù)學表達式>
變量X將被賦值為表達式的值,在回溯時不賦值。
X >= Y?
X =< Y

//asserta(X)
把子句X當作此子句的謂詞的第一個子句加入到動態(tài)數(shù)據(jù)庫中。它和I/O內(nèi)部謂詞的流程控制相同?;厮菔鞘?#xff0c;并且不會取消它所完成的工作。

//retract(X)
把子句X從動態(tài)數(shù)據(jù)庫中刪除。此操作也是永久性的,也就是說回溯的時候不能撤銷此操作。

//not/1內(nèi)部謂詞,它的參數(shù)是一個目標,如果此目標失敗,則它成功;目標成功則它失敗。

//聯(lián)合
變量&任何項目: 變量可以與任何項目綁定,其中也包括變量?
原始項目&原始項目: 兩個原始項目(原子或整數(shù))只有當它們相同時才能聯(lián)合。?
結(jié)構(gòu)&結(jié)構(gòu): 如果兩個結(jié)構(gòu)的每個相應(yīng)的參數(shù)能聯(lián)合,那么這兩個結(jié)構(gòu)可以聯(lián)合。?
‘=/2’內(nèi)部謂詞,此謂詞當它的兩個參數(shù)能夠聯(lián)合時成功,反之則失敗。它的語法如下:
=(arg1, arg2)
為了方便閱讀,也可以寫成如下形式:
arg1 = arg2? 注意:此處的等號在Prolog中的意義與其他語言中的不同。它不是數(shù)學運算符或者賦值符。
如果在兩次綁定中變量的值發(fā)生沖突,那么目標就失敗了。
如果變量不能綁定為某一可能的值,那么聯(lián)合也將失敗。
匿名變量(_)不會綁定為任何值。所以不要求它所出現(xiàn)的位置的值必須相同。

//列表
列表是一組項目的集合,此項目可以是Prolog的任何數(shù)據(jù)類型,包括結(jié)構(gòu)和列表。列表的元素由方括號括起來,項目中間使用逗號分割。
我們可以使用列表來代替以前的多個子句。例如: loc_list([apple, broccoli, crackers], kitchen).
當某個列表中沒有項目時我們稱之為空表,使用“[]”表示。也可以使用nil來表示。下面的句子表示hall中沒有東西。 loc_list([], hall)

//op/3來定義操作符,它的三個參數(shù)分別是:優(yōu)先權(quán)、結(jié)合性、操作符名稱。
每個操作符有不同的優(yōu)先權(quán)值,從1到1200。當某句中有多個操作符時,優(yōu)先權(quán)高的將先被考慮。優(yōu)先權(quán)值越小優(yōu)先權(quán)越高。
結(jié)合性使用模板來定義,例如中綴操作符使用“xfx”來定義?!癴”表示操作符的位置。
當操作符的優(yōu)先權(quán)相同時,Prolog必須決定是從左到右還是從右到左地讀入操作符。這就是操作符的左右結(jié)合性。有些操作符沒有結(jié)合性,如果你把兩個這種操作符放到一起將產(chǎn)生錯誤。
Infix:?
xfx non-associative (沒有結(jié)合性)?
xfy right to left?
yfx left to right?
Prefix?
fx non-associative?
fy left to right?
Postfix:?
xf non-associative?
yf right to left?
為了表示這種嵌套關(guān)系,我們可以使用從右到左的結(jié)合性。
?- op(35,xfy,is_in).?


//display/1可以看到操作符等的標準的語法結(jié)構(gòu)。

//只有一些特殊的內(nèi)部謂詞(例如is/2)進行真正的數(shù)學運算。is/2計算它右邊表達式的值,并讓左邊綁定為此值。它與聯(lián)合(=)謂詞是不同的,=只進行聯(lián)合而不進行計算。

總結(jié)

以上是生活随笔為你收集整理的Prolog学习笔记100805的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。