前言
如果你是一位prolog的新手,希望你首先閱讀這篇文章,好對prolog的全局有個了解,本文將詳細介紹prolog學習流程編程思路上以及prolog語法細節。
首先,問一個基礎的問題:我們已經在Prolog程序中看到了很多類型的表達式(比如,jody,playsAirGuitar(mia),和X),但這些僅僅只是例子,是時候更加深入了,到底事實、規則和查詢是由什么構成的?
答案就是語句(terms),在Prolog中一共存在四種類型的語句:原子,數字,變量和復雜語句(或者稱為結構).原子和數字統稱為常量,常量和變量統稱簡單語句.
首先要明確基礎的字符的范圍:大寫字母:A,B,...,Z;小寫字母:a,b,...,z;數字:0,1,2,...,9.另外還包括“_”,即英文下劃線字符;和其他一些特殊英文字符,比如:+,-,*,/,《,》,=,:,.,&,~;空格也是字符,但是不常用,并且也不可見.字符串是指沒有切斷的字符序列.
原子(Atoms)
一個原子是以下情況之一:
1. 由字符構成的字符串,其中有效字符包括:大字字母,小寫字母,數字,和下劃線,并且是小寫字母作為頭字符.一些例子:butch,big_kahuna_burger,listen2Music,playsAirGuitar.
2. 使用單引號封裝的字符序列.比如:‘Vincent’,‘The Gimp’,‘Five_Dollar_Shake’,‘&^%%@# *’,‘ ’.被單引號封裝的字符序列被稱為原子名.注意我們已經使用了空格字符,
事實上,使用單引號封裝,其中的一個作用就是可以在原子中精確地使用類似空格字符這樣的特殊字符.
3. 特殊字符組成的字符串.比如:@=,====》,;,:-等都是原子.正如我們看到的,一些特殊原子,比如;(邏輯或),:-(規則中連接頭部和主干的符號)已經有預定義的含義.
數字(Numbers)
在典型的Prolog程序中,實數并不是很有用武之地.所以雖然大多數Prolog的實現都支持浮點數,但是本文不討論.
但是整數(比如:-2,-1,0,1,2,...)卻十分有用,比如在計算列表的元素數目之類的工作時候,我們將會在第5章詳細介紹.Prolog中數字的表示很簡單,沒有什么特殊,如下:
23, 1001, 0, -365, 等等.
變量(Variables)
變量是由大寫字母,小寫字母,數字和下劃線組成的字符串,并且頭字母必須是大寫字母或者下劃線.比如:
X, Y, Variable, _tag, X_526, List, List24, _head, Tail, _input, Output
都是Prolog中有效的變量.變量”_“是一個特例,它被稱為匿名變量,我們將會在第4章中介紹.
復雜語句(Complex Terms)
常量,數字,和變量都是構建語句的模塊,現在我們學習如何將它們組成復雜語句.復雜語句也稱為結構體.
復雜語句由一個函子(functor,也可以理解為函數名)和一個參數序列構成.參數序列放在小括號內,由英文逗號分隔,并且是放在函子后面.請注意函子后面必須緊跟參數序列,
中間不能有空格.函子必須是一個原子,即,變量不能用作函子.另一方面,參數序列可以是任何類型的語句.
從KB1到KB5,我們已經看到了許多復雜語句的例子.比如,playsAirGuitar(jody)就是一個復雜語句,其中playsAirGuitar是函子,jody是參數序列(只有一個參數).另一個
例子是loves(vincent, mia),loves是函子,vincent和mia是參數序列;再比如一個包含了變量的例子:jealous(marsellus, W).
(注:函子和謂詞由一定區別,我的理解是:函子是謂詞的名字,謂詞包含了函子及其參數序列,是整個邏輯的實現統一體.)
但是,復雜語句的定義可以允許更為復雜的情況.事實上,在復雜語句中,也可以內嵌其他復雜語句(就是說,復雜語句允許遞歸).比如:
hide(X, father(father(father(butch)))).
就是一個完美的符合定義的復雜語句.它的函子是hide,有兩個參數:一個是變量X,另外一個是復雜語句,father(father(father(butch))).這個復雜語句組成是:函子是father,
另外一個復雜語句,father(father(butch))是其唯一的參數.里層的復雜語句的參數依然是一個復雜語句:father(butch).但是到了嵌套的最里層,參數就是一個常量:butch.
實際上,這種嵌套(遞歸結構)使得我們可以自然地描述很多問題,而且這種遞歸結構和變量合一之間的互相作用,正是Prolog強有力的武器.
復雜語句的參數個數稱為元數(arity).比如,woman(mia)是一個元數為1的復雜語句,loves(vincent, mia)是一個元數為2的復雜語句.
元數對于Prolog很重要.Prolog允許定義函子相同但是元數不同的復雜語句.比如,我們可以定義兩個參數的loves謂詞,loves(vincent, mia);也可以定義三個參數的loves謂詞,
loves(vincent, marsellus, mia).如果我們這么做了,Prolog會認為這兩個謂詞是不同的.在第5章中,我們將會看到定義相同函子但是元數不同的具體應用.
當我們需要提及定義的謂詞,介紹如何使用它們的時候(比如,在文檔中),慣例是”函子/元數“這種形式.回到KB2,我們有三個謂詞,之前的表達如下:
listen2Music
happy
playsAirGuitar
使用正式的書寫方式如下:
listen2Music/1
happy/1
playsAirGuitar/1
Prolog不會因為定義了兩個loves謂詞而迷惑,它會區分loves/2和loves/3是不同的謂詞.
評論
查看更多