陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司 第十二章 Prolog 程式語言 陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司
大綱 簡介 基本資料結構 Prolog語言的陳述 Prolog語言推論的過程 精選習題
簡介 Prolog(PROgramming in LOGic)是在1970年代初期發展 主要應用在人工智慧(Artificial Intelligence),又稱為人工智慧的高階語言 日本發展的第五代電腦計劃採用Prolog為其語言,使得Prolog語言漸受世人注意,且廣泛地被使用 Prolog為適用於處理符號和非數值運算之程式語言 邏輯式程式語言
基本資料結構 – 原子 (atom) 原子的組成有三種可能的方式 由單引號所括住的字串組成: 由特殊的字元所組成的字串 ’Peter’,’Visual Basic’,’Prolog’ 由特殊的字元所組成的字串 &&,::=,<>=,.... 由字母,數字或「底線字元」所組成的字串,但須注意,該字串的第一個字元絕對必須是小寫字母 peter,visualbasic,visual_basic
基本資料結構 – 變數(variable) 變數是由字母,數字或「底線字元」所組成的字串 注意 字串的第一個字元,必須是大寫字母 Peter,Visualbasic,Visual_basic
基本資料結構–結構化資料型態 串列(list) 結構(structure) 結構的語法為 原子名稱 (參數串列) 串列結構(list structure)中,前端與後端皆必須以方括號作記號且串列中的元素必須以“,”作區分。如:〔Pascal, C, Basic, Cobol, Fortran〕 b.在Prolog中以〔H│X〕來表示一個串列的頭部與尾部。以上例來說,H=Pascal(相當於Lisp之CAR)且X=〔C, Basic, Cobol, Fortran〕(相當於LISP之CDR) 結構(structure) 結構的語法為 原子名稱 (參數串列) date(日,月,年) date(25,8,83)
Prolog 語言的陳述 事實陳述(fact statement) 規則陳述(rule statement) 目的陳述(goal statement)
事實陳述 事實陳述指明“事實” 事實陳述宣告一些無條件成立的事情 通常事實陳述是用來描述個體的性質或個體與個體之間的關係 又稱為無首霍恩子句(Headless Horn clause)
事實陳述 實例 注意 個體的性質 female(helen). male(peter). female(jane). male(john). 個體與個體之間的關係 son(john, helen). son(john, peter). daughter(jane, helen). daughter(jane, peter). 注意 Prolog的敘述之後,必須有句點作為結束
規則陳述 規則陳述是用來描述事實之間的邏輯關係,即必須在某種條件成立的條件下才為真的事情 又稱為有首霍恩子句(Headed Horn clause) 規則陳述結構: 結論部份:- 條件部份 其中結論部份又稱為首項,而條件部份所有的子條件皆成立時結論部份自然成立
規則陳述 實例 mother(helen, jane):- daughter(jane, helen), female(helen). “:-”右邊的敘述為陳述的來歷或規則 “:-”左邊的敘述,為陳述的結論 若來歷為真則結論也必定為真 陳述的來歷若有多個,則以逗號連接而其意義與邏輯運算子AND相同
目的陳述 目的陳述即是用來作為查詢(query)資料之用 目的陳述在程式段中是看不到的 實例 ?- daughter(jane, helen). Yes. ?- daughter(X, helen). jane; No. ?- daughter( _ , helen). jane; No.
Prolog 語言推論的過程 以目的陳述為目標,根據程式中的事實與規則陳述來進行推論,並以敘述定義之先後順序來進行推理動作 以目的陳述的函元(functor)以搜尋之依據,若符合者為 事實陳述:直接回答 規則陳述: 以每個規則為子目標 深度優先搜尋(DFS- Depth First Search) 回溯處理(backtracking):在推理的過程中若產生錯誤,此時系統會自動回溯到另一個可能正確的推理方向
精選習題 以下的PROLOG程式執行後,結果為何? append (〔〕,X,X). append (〔H|X〕,Y,〔H|Z〕):-append(X,Y,Z). ?- append (〔a,b〕,〔c,d〕,Z).
精選習題 假設有一PROLOG程式如下: first (Xs,Ys,IP):- second(Xs,Ys,O,IP). second (〔X|Xs〕,〔Y|Ys〕,Temp,IP):- Temp1 is X*Y+Temp,Second(Xs,Ys,Temp1,IP). second (〔〕,〔〕,IP,IP). 假設我們所鍵入的問句(query)為: ?- first (〔2,3,1〕,〔3,2,6〕,X). 則所得的結果(亦即X值)為何?
精選習題 假設有一個PROLOG程式如下: class_sem(drinks,drink). class_sem(candies,food). class_sem(cakes,food). class_sem(tea,beverage). class_sem(coffee,beverage). sem_class([],[]). sem_class([X|T],[Y|R]):-class_sem(X,Y),sem_class(T,R). 假設所輸入之問句為: ?- sem_class([mary,eats,cakes],Answer). 則Answer之結果為?
精選習題 假設有一個PROLOG程式如下: test(X,[X|Xs],Xs):-!. test(X,[Y|Ys],[Y|Zs]):-test(X,Ys,Zs). 假設所輸入之問句為: ?- test(3,[1,2,2,3,3,4],Result). 則Result之結果為?
精選習題 在PROLOG語言中,事實(fact)和規則(rule)的語法及其用法。 PROLOG程式設計師有那兩種方法可以控制求解(resolution)過程中的型樣比對(pattern match)順序?