Prolog語言介紹
Prolog的英語意思就是Programming in logic(邏輯編程)橘蜜。與幾乎無所不能的C語言或是Python語言不同,Prolog不是一種通用語言几于,比如說它并不能夠寫出3D游戲引擎,它是建立在邏輯學的理論基礎之上的一種獨特的編程語言。不夠全能但它仍然是一種值得學習的語言嫂丙,它也被廣泛的應用在人工智能的研究中乖仇,它可以用來建造專家系統(tǒng)憾儒、自然語言理解、智能知識庫等乃沙。
如果你有一些基礎的邏輯學知識起趾,用Prolog解決一些邏輯推理問題方面會很方便,它能夠比其他的語言更快速地開發(fā)此類程序警儒。因為它的編程方法更象是使用邏輯的語言來描述問題训裆,而不是編寫程序,Prolog的程序和數(shù)據(jù)高度統(tǒng)一蜀铲,很難分清楚哪些是程序边琉,哪些是數(shù)據(jù)的。事實上记劝,prolog中的所有東西都有相同的形式变姨,也就是說數(shù)據(jù)就是程序,程序就是數(shù)據(jù)厌丑。這與我們常見的編程語言完全不是一種思維方式,prolog程序甚至沒有特定的運行順序定欧,其運行順序是由電腦決定的。
進入Prolog世界
我們選擇Prolog的一種實現(xiàn)怒竿,叫做SWI Prolog砍鸠。他的在Linux,Mac愧口,Windows下都可以安裝睦番,下載頁面,安裝很簡單這里就不介紹了耍属。SWI Prolog還支持中文來編程托嚣。我們先來看看什么邏輯編程,Prolog簡單到只有下面三種基本語句厚骗,
1. 事實
事實用來說明已知對象之間的關系或是對象的定義示启。在Prolog程序中,事實由謂詞名及用括號括起來的一個或幾個對象組成领舰。謂詞和對象可由用戶自己定義夫嗓。比如:
喜歡(小明,小紅)
這是一個名為喜歡
的關系迟螺,表示對象小明
對于小紅
之間有喜歡的關系。
漫畫(哆啦A夢)
這是一個名為漫畫
的表述舍咖,表示對象哆啦A夢
是一種稱為漫畫
的東西矩父。
有了事實的邏輯聲明就可以詢問Prolog系統(tǒng),來判斷誰喜歡誰排霉,或是什么是什么窍株。
我們這里先把上面兩句保存到一個文件里,文件名為like.pl
攻柠。默認情況下球订,SWI-Prolog安裝后的可執(zhí)行文件名稱為“swipl”,我們打開當前目錄的命令行瑰钮,輸入swipl冒滩,成功的話會有類似如下顯示:
$ swipl
Welcome to SWI-Prolog (threaded, 64 bits, version 7.6.4)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. for legal details.
For online help and background, visit http://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).
?-
這里就打開了swi prolog的交互式環(huán)境,你可以在?-
后面輸入命令浪谴,這種解釋型的交互環(huán)境很像Python开睡。
現(xiàn)在我們有一些事實
儲存在like.pl
文件里,我們先加載這個文件到Prolog系統(tǒng)里较店,我們可以輸入consult(like).
士八,也可以用簡略的寫法[like]
容燕,注意不要忘記句號梁呈,這里的意思是加載當前文件夾的叫做like
的文件,如果正確這時系統(tǒng)會返回一個true
蘸秘,代表命令執(zhí)行正確官卡。
?- [like].
true.
2. 查詢
現(xiàn)在我們可以對這個系統(tǒng)進行詢問了,這就是Prolog的第二類語句醋虏,查詢寻咒。如果現(xiàn)在我們詢問小紅是不是喜歡小明,會獲得一個false的答復颈嚼,因為事實里只有小明喜歡小紅毛秘。
?- 喜歡(小紅,小明).
false.
?- 喜歡(小明,小紅).
true.
在這個系統(tǒng)里,叫西游記
的東西不是漫畫阻课,哆啦A夢
才是漫畫叫挟。
?- 漫畫(西游記).
false.
?- 漫畫(哆啦A夢).
true.
只有這兩條事實有點少,下面我們增加幾條事實來測試限煞。
修改like.pl
文件:
喜歡(小明,小紅).
喜歡(小王,小紅).
喜歡(小紅,小李).
喜歡(小李,小花).
喜歡(小花,小李).
重新加載like.pl
文件:
?- [like].
true.
現(xiàn)在我們來學幾個新的查詢抹恳,我想看看有哪幾個人喜歡小紅。這里X
是代表一個未知對象署驻。
?- 喜歡(X,小紅).
X = 小明 ;
X = 小王.
注意奋献,這里的X
必須大寫健霹,在第一個答案出現(xiàn)后如果沒有結束,可以按;
繼續(xù)瓶蚂,如果不想看其他答案糖埋,可以按回車結束。這里得到兩個答案窃这,小明和小王都喜歡小紅阶捆。
3. 規(guī)則
現(xiàn)在除了單一事實喜歡
之外,還想要有一些組合的條件來表示某些事實钦听,這就是規(guī)則
洒试。規(guī)則由幾個互相有依賴性的簡單句(謂詞)組成,用來描述事實之間的依賴關系朴上。
例如:戀人(X,Y):-喜歡(X,Y),喜歡(Y,X).
這里X
和Y
代表兩個不同的未知對象垒棋,表示如果X喜歡Y,而且Y也喜歡X痪宰,那么他們就是戀人
關系叼架。繼續(xù)修改like.pl
文件加入規(guī)則:
喜歡(小明,小紅).
喜歡(小王,小紅).
喜歡(小紅,小李).
喜歡(小李,小花).
喜歡(小花,小李).
戀人(X,Y):-喜歡(X,Y),喜歡(Y,X).
重新加載后繼續(xù)詢問系統(tǒng);
?- [like].
true.
?- 戀人(小紅,Y).
false.
?- 戀人(小李,Y).
Y = 小花.
?- 戀人(X,Y).
X = 小李,
Y = 小花 ;
X = 小花,
Y = 小李.
這里發(fā)現(xiàn)小紅沒有戀人衣撬,而這個系統(tǒng)中只有小李和小花互為戀人乖订。
是不是有點意思了伐庭,那這些關系中還能分析出什么呢烤镐?我們最后來找找誰和誰是情敵關系吧:
我們這么定義情敵:如果X喜歡Z,而且Z又不喜歡X柳譬,Z喜歡Y扛点,那么X和Y就是情敵哥遮。這么寫:情敵(X,Y):-喜歡(X,Z),not(喜歡(Z,X)),喜歡(Z,Y).
,這里的not()代表否定一個規(guī)則陵究。
現(xiàn)在文件是這樣眠饮,編輯完后重新加載:
喜歡(小明,小紅).
喜歡(小王,小紅).
喜歡(小紅,小李).
喜歡(小李,小花).
喜歡(小花,小李).
戀人(X,Y):-喜歡(X,Y),喜歡(Y,X).
情敵(X,Y):-喜歡(X,Z),not(喜歡(Z,X)),喜歡(Z,Y).
小王的情敵是誰呢?我們不用自己去判斷了铜邮,來問問系統(tǒng)吧仪召!
?- 情敵(小王,Y).
Y = 小李.
看完上面的例子,不知道是否提起了你對prolog的興趣松蒜。prolog有許多不足之處扔茅,但是這并不影響它在邏輯推理方面的強大功能,不過最好的方法是使用某種通用語言和prolog結合牍鞠,通用語言完成計算咖摹、界面之類的操作,而prolog則專心實現(xiàn)邏輯運算的操作难述。例如:你編寫一個下棋程序萤晴,用prolog來讓電腦思考如何下棋吐句,而用別的語言來編寫界面。
到這里我們已經(jīng)大概體驗了這種邏輯編程語言店读,但這還遠遠不是Prolog的全部嗦枢,下一節(jié)我們將繼續(xù)學習這種強大的邏輯編程語言。
這里SWI Prolog提供了一個在線編程環(huán)境屯断,如果你不愿意安裝也能嘗試Prolog文虏,點擊Create aProgram
,就可以新建程序了殖演,左側是程序區(qū)氧秘,右側下面是查詢區(qū)。
最新STEM知識分享請關注STEM實驗室 :www.steamlab.club