<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    Logic Programming With Prolog學習筆記(一)

    Posted on 2008-05-28 23:05 dennis 閱讀(4060) 評論(0)  編輯  收藏 所屬分類: 動態語言
    第一章:Getting start

    1hello world

    write(“Hello World”),nl,write(“Welcome to Prolog”),nl.

    .號做結束,有一系列目標(goal)組成(一般也稱為查詢query),目標之間用,號隔開,這里的writenl其實是內建的IO謂詞,總共4個目標按順序執行,nl是開始一個新行,所有目標達成,Prolog系統會輸出yes

    2halt也是BIPs,用于結束Prolog系統,statistics用于系統統計(cpu、內存等)。BIPs都是會產生副作用的謂詞。比如write就是會產生輸出到用戶屏幕副作用的IO謂詞。

    3、第一個程序,寫入下列代碼并保存為prog1.pl:

    dog(fido).

    cat(felix).

    animal:-dog(X).

    通過consult謂詞,將該程序導入數據庫(本質上,Prolog系統就是一個全局數據庫), 分析下代碼:

    dog(fido).

    cat(felix).

    就是所謂事實(fact),dogcat就是謂詞,而fidofelixatom,這里陳述了兩個事實:fido是一只狗,felix是一只貓。animal:-dog(X). 這句就是規則(rule),:-符號可以理解為如果(注:if)X是變量,這里描述的規則就是:如果X是狗,那么X就是動物。因此,依據事實和規則,Prolog的推理系統可以推論:fido是狗,所以fido是動物:

    | ?- animal(fido).

    yes

    顯然,根據animal規則,felix不是動物,雖然它是:

    | ?- animal(felix).

    no

    4Prolog的注釋 /* this is a comment */

    5、查詢,dog(X),查詢所有滿足謂詞dogX,也就是找出所有的狗狗。

    dog(X),cat(X).查詢所有是狗又是貓的“東西”。Listing(dog),列出所有定義了謂詞dog的語句。


    6Prolog的數據類型:

    1)數字,Number623,+3,-.245

    2)Atom,所有的不包括數值在內的常量,這與Erlang中的atom概念是一脈相承

    包括:以小寫字母開頭的字母、數字、下劃線的組合,單引號括起來的字符序列,+-*/<>=@&#特殊字符組成的序列

    3)變量:在查詢中代表未決的term,以大寫字母或者下劃線開頭,跟Erlang一樣,_表示啞元

    4)組合Term,類似其他語言中的記錄結構,以一個atom開頭,后接一個參數列表,參數也都是term,參數的個數就是它的arityErlang也是如此),例如:

    read(X)

    dog(henry)

    likes(dog(henry),Y)

    5)列表,如:

    [dog,cat,mypred,[a,b,c],hello]

    6)其他類型,某些 Prolog方言可能會有字符串類型,用于處理字符串。

    第二章 語句和謂詞

    1. 一個Prolog程序就是由一系列語句(clause)組成的,語句可以多行,以引文句號結束。兩種基礎語句:事實和規則。

    2. 事實語句,是由atom或者組合term構成(兩者統稱為call terms),如:

    chrismas.

    likes(john,mary).

    1. 規則,形式如下:

    head:-t1,t2,…,tk. (k>=1)

    head成為規則的頭部,也必須是call term:-稱為頸部操作符,讀作if,而t1,t2…tk就是語句的body,它們描述了頭部的結論所需要滿足的條件。Body是由一個或者多個componet組成,compont就是目標,以逗號隔開,逗號表示and的關系。從另一個角度看,head可以成為目標,body是它的子目標,規則就是為了達到目標head,必須先達到子目標t1,t2…tk

    例子:

    large_animal(X):-animal(X),large(X).

    go:-write(‘hello world’),nl.

    1. 謂詞,所有語句的頭部都包括了一個謂詞定義,不同參數的同名謂詞是不同的謂詞,參數數目就是所謂元數(arity)。謂詞可以記錄為pred/n,比如parent/1,表示謂詞名為parent,而參數個數是一個,這個與Erlang相同。謂詞可分為用戶自定義的維持和built-in謂詞(BIPs)。IO謂詞如write,nl就是BIPs,它們都是總會成功的謂詞,并帶來相應的IO副作用(輸出和換行)。用戶不能重定義BIPs

    2. 謂詞的遞歸定義,分為直接和間接遞歸,例子:

    likes(john,X):-likes(X,Y),dog(Y). 描述的規則為:john喜歡的是那種至少喜歡一只狗的人。

    1. loading語句,包括兩個BIPsconsult/1reconsult/1,用于產生將文件中的語句導入數據庫的副作用,兩者的區別是,reconsult會覆蓋之前定義的相同謂詞,而consult不會。consult[‘prog1.pl’]可以簡化為[‘prog1.pl’].同樣,reconslt[‘prog1.pl’]可以簡寫為[-‘prog1.pl’]

    2. 變量,一開始所有的變量都是未綁定的,當目標被執行時,變量可能被綁定或者解綁定。變量存在作用域,不同語句中的同名變量沒有任何關系。

    3. 量詞,

    1)全稱量詞,出現在事實或者規則head部分的變量,表示事實或者規則的該變量的所有可能值,這樣的變量成為全稱量詞,如

    large_animal(X):-animal(X),large(X). 中的X

    2)存在量詞,不在事實或者規則的head部分中存在,但是在body部分中出現的量詞,僅僅為了表示該變量至少存在一個值,這樣的變量稱為存在量詞。例如:

    person(dennis,zane,male,25,programmer).

    man(A):-person(A,B,male,C,D).

    man謂詞body部分的B,C,D變量就是存在量詞


    9.匿名變量,就是所謂啞元,下劃線_表示,表示你并不care這個變量的值是什么,僅僅為了占位,用以表示任意值,與Erlang中的意義一致。


    第三章

    1、這一章主要將描述Prolog系統是如何滿足目標的執行。

    2Prolog系統是按照順序執行目標的,每個目標都是由call term組成,每個目標都與一個相應的謂詞相關聯,謂詞的名稱稱為functor,而參數個數就是元數(arity)。Prolog系統是從上到下,依據語句的head部分來匹配目標,如果匹配,將輸出yes,否則就是no。對于用戶定義的目標,Prolog沒有找到任何事實或者規則與之匹配的話,那么就是fail。這不是什么未知或者不確定,這個其實就是所謂的封閉世界假設(closed world assumption):任何結論如果無法從數據庫中的事實和規則中得到證明,那么這個結論就是否定的,沒有什么系統不確定或者未知這樣的中間位置。

    3Prolog的匹配算法——聯合(unification),

    變量可以跟任何term聯合,其中包括了變量,其實就是變量的綁定。例如:

    X=1X1聯合. dog(X)dog(ferris),將Xferris聯合。

    call terms的聯合過程:


    1)如果兩個call term都是atom,只有當它們是一樣的時候才可以聯合,比如:

    testtest聯合成功

    dennis跟'dennis'聯合成功

    applefuck聯合失敗

    2)對于組合call term的聯合,要求兩個call term有一樣的functorarity,并且參數也要成對地聯合成功。

    聯合的詳細規則如下:

    1)兩個atom當且僅當它們是一樣的時候才是聯合成功的。

    2)兩個組合的term聯合成功,當且僅當兩者有一樣的functorairty,并且參數也要從左到右兩兩成對地聯合成功。

    3)兩個number聯合成功,當且僅當它們是一樣的時候,例如77聯合成功,而76.9就失敗

    4)兩個未綁定的變量總是聯合成功的,兩者互相綁定

    5)一個未綁定變量和一個不是變量的term也總是聯合成功的,將變量綁定為該term

    6)一個綁定的變量可以被認為它所綁定的值。例如

    pred(X,X,man)

    pred(landon,dog,A)聯合失敗,因為在第一個參數聯合成功后,X就被認為是landon,那么在嘗試聯合第二個參數的時候,顯然landondog聯合失敗。

    7)兩個列表聯合成功,當且僅當它們擁有相同數目的元素,并且元素間從左到右成對地聯合成功。

    8)嵌套結構按照這些規則遞歸,其他情況下的聯合都是失敗的。


    4、目標的求值,兩張圖描述:


    5、回溯(backtracking),回溯就是一個返回前一個滿足的目標,尋找其他方式重新滿足該目標的過程。回溯,顧名思義就是退回去,再來過,當輸入;號,就強制Prolog系統回溯以尋找更多的匹配

    6、目標求值的概覽:



    第四章 操作符

    1、通過op謂詞,可以將用戶自定義的謂詞轉成某種操作符,例如:

    likes(dennis,catty).

    我們更希望表達成:

    dennis likes catty.

    這在默認情況是不行的,通過op謂詞轉化likes謂詞成中綴操作符:

    op(150,xfy,likes).

    然后就可以這樣使用likes謂詞了:

    dennis likes catty.


    op謂詞一般形式

    op(操作符優先級,(xfy|xf|fy),謂詞名稱)

    2、算術運算:通過內建的is/2謂詞來進行算術運算,is/2是一個內建的中綴運算符,例如:

    X is 2.

    X is 3,Y is X+3.

    出現在第二個參數的變量必須是已經綁定。+ - * /稱為算術運算符,還有一類稱為算術函數,它們并不是謂詞,例如abs/1 sqrt/1等,完整列表:

    + - * /

    X//Y 兩個整數的商

    X^Y 表示XY次方,在gnu prolog上是**,與ruby一樣。

    -X 一元操作符

    abs(X)

    sqrt(X)

    sin(X)

    cos(X)

    max(X,Y)


    is/2的第一個參數也可以是表達式或者數字,在此情況下,兩個參數都會被計算,如果相等,則succeeds,否則失敗。因此is/2謂詞也可以解釋為,求值看兩個參數是否可以聯合成功。如果第一個參數是變量,就將第二個參數的值綁定在該變量上,如果第一個參數是數值或者算術表達式,就比較兩個參數的值是否相等,相等則聯合成功,如果第一個參數是atom,term.list等,聯合的情況依賴于實現。永遠失敗的is/2:

    X is X+1.總是失敗。


    操作符的優先級與算術中的一樣,可以通過括號強制優先級。


    算術比較操作符:=:=,=\=,>,>=,<,=<


    3、等價操作符:

    1)算術表達式比較:

    E1=:=E2 成功當且僅當兩個表達式求值的結果一致。

    E1=\=E2 成功當且僅當兩個表達式求值的結果不一致。

    2Term相同比較:

    Term1==Term2成功當且僅當Trem1Term2完全相同。

    因此:

    likes(X,prolog)==likes(X,prolog)相同

    likes(Y,prolog)==likes(Y,prolog)失敗,XY是不同的變量

    3+7==6+4 失敗,兩個表達式不會被求值,顯然不同

    Term1 \==Term2成功當且僅當Trem1Term2不同。


    3Term聯合的比較:

    =操作符與==類似,不同在于,Term1=Term2當且僅當Term1Term2聯合成功的時候成功,也就是能找到某種方式綁定變量的值,來讓兩者相同。例如

    6+X=6+3。成功,X綁定為3

    6+4=3+7 仍然失敗

    X=0,X=:=0. 成功,將X綁定為0,算術比較成功。

    =的相反操作符就是\=


    4、邏輯操作符:取反操作符not,表示or;

    例如:

    X=0,not X is 0. 返回no

    6<3;7 is 2+5.返回yes

    主站蜘蛛池模板: 亚洲精品无码久久毛片| 97久久精品亚洲中文字幕无码| 一区在线免费观看| 婷婷亚洲久悠悠色悠在线播放| 无码一区二区三区AV免费| 男性gay黄免费网站| 亚洲成AV人片在| 大地资源在线观看免费高清| jizz日本免费| 亚洲国产精品成人精品小说| 亚洲福利视频一区二区| 91成人在线免费视频| 疯狂做受xxxx高潮视频免费| 噜噜噜亚洲色成人网站∨| 国产成人涩涩涩视频在线观看免费| 国产又黄又爽胸又大免费视频 | 国产精品免费久久| 亚洲成年人电影网站| 亚洲成AV人在线观看网址| 免费能直接在线观看黄的视频| 黄网站在线播放视频免费观看| 亚洲色偷偷偷网站色偷一区| 亚洲AⅤ优女AV综合久久久| 2021国内精品久久久久精免费| 一区二区三区免费精品视频| 亚洲大香伊人蕉在人依线| 国产亚洲视频在线播放| 精品剧情v国产在免费线观看| 人妻丰满熟妇无码区免费| 色哟哟国产精品免费观看| 77777午夜亚洲| 亚洲阿v天堂在线| 国产免费69成人精品视频| 99免费视频观看| 中文字幕在线观看免费| 亚洲爆乳大丰满无码专区| 亚洲国产精品网站久久| 亚洲AV人人澡人人爽人人夜夜| 亚洲人成人网站在线观看| 国产精品无码免费视频二三区| 日韩欧毛片免费视频|