Prolog 語言簡介與入門

2021-03-01 演示中的機器人學習

Prolog 是一種與眾不同的語言,不用來開發軟體,專門解決邏輯問題。比如,"蘇格拉底是人,人都會死,所以蘇格拉底會死"這一類的問題。

Prolog 就是"邏輯編程"(programming of Logic)的意思。只要給出事實和規則,它會自動分析其中的邏輯關係,然後允許用戶通過查詢,完成複雜的邏輯運算。

本文簡單介紹如何使用 Prolog 語言,主要參考了 xmonader 的教程。

一、SWI-Prolog

學習之前,請安裝 Prolog 的運行環境 SWI-Prolog,才能運行後面的代碼。

SWI-Prolog 官網有各個作業系統的二進位安裝包,下載即可。Debian / Ubuntu 系統還可以用下面的命令。


$ sudo apt-get install swi-prolog

安裝以後,Linux 系統可以命令行啟動。


$ swipl
?-

然後,就進入了 Prolog 運行環境,?-是命令提示符。下面是 Hello world 的例子。


?- write("Hello, world").
Hello, world!
true.

上面命令輸出 Hello world。

有幾個地方需要注意。Prolog 所有語句的結尾都用一個"點"(.)表示結束。write()是列印命令。命令本身就是一個表達式,輸出完成以後,返回值就是true.,也會顯示出來。

如果想在 Hello world 之間插入一個換行,可以使用nl命令。


?- write('Hello,'), nl, write('world').
Hello,
world
true.

退出 SWI-Prolog,可以使用halt命令,別忘了後面還要加一個點。


?- halt.

二、基本語法2.1 常量和變量

Prolog 的變量和常量規則很簡單:小寫字母開頭的字符串,就是常量;大寫字母開頭的字符串,就是變量。


?- write(abc).
abc
true.

?- write(Abc).
_3386
true.

上面代碼中,abc是常量,輸出就是自身;Abc是變量,輸出就是該變量的值。

2.2 關係和屬性

兩個對象之間的關係,使用括號表示。比如,jack 的朋友是 peter,寫成friend(jack, peter).。

注意,jack 的朋友是 peter,不等於 peter 的朋友是 jack。如果兩個人都認為對方是朋友,要寫成下面這樣。


friend(jack, peter).
friend(peter, jack).

如果括號裡面只有一個參數,就表示對象擁有該屬性,比如 jack 是男性,寫成male(jack).。

2.3 規則

規則是推理方法,即如何從一個論斷得到另一個論斷。

舉例來說,我們定下一條規則:所有朋友關係都是相互的,規則寫成下面這樣。


friend(X, Y) :- friend(Y,X).

上面代碼中,X和Y都是大寫,表示這是兩個變量。符號:-表示推理關係,含義是只要右邊的表達式friend(Y, X)為true,那麼左邊的表達式friend(X, Y)也為true。因此,根據這條規則,friend(jack, peter)就可以推理得到friend(peter, jack)。

如果一條規則取決於多個條件同時為true,則條件之間使用逗號分隔。


mother(X, Y) :- child(Y,X), female(X).

上面代碼中,X是Y的母親(mother(X, Y))取決於兩個條件:Y是X的小孩,X必須是女性。只有這兩個條件都為true,mother(X, Y)才為true。

如果一條規則取決於某個條件為false,則在條件之前加上\+表示否定。


onesidelove(X, Y) :- loves(X, Y), \+ loves(Y,X).

上面代碼中,X單相思Y,取決於兩個條件。第一個條件是X喜歡Y,第二個條件是Y不喜歡X。

2.5 查詢

Prolog 支持查詢已經設定的條件。我們先寫一個腳本hello.pl。


friend(john, julia).
friend(john, jack).
friend(julia, sam).
friend(julia, molly).

然後在 SWI-Prolog 裡面加載這個腳本。


?- [hello].
true.

上面代碼中,true.是返回的結果,表示加載成功。

然後,可以查詢兩個人是否為朋友。


?- friend(john, jack).
true.

?- friend(john, sam).
false.

listing()函數可以列出所有的朋友關係。


?- listing(friend).
friend(john, julia).
friend(john, jack).
friend(julia, sam).
friend(julia, molly).

true.

還可以查詢john有多少個朋友。


?- friend(john, Who).
Who = julia ;
Who = jack.

上面代碼中,Who是變量名。任意的變量名都可以,只要首字母為大寫。

三、地圖著色問題

下面看看 Prolog 如何解決實際問題。

我們知道,地圖的相鄰區域不能使用同一種顏色。現在有三種顏色:紅、綠、藍。請問如何為上面這幅地圖著色?

首先,定義三種顏色。


color(red).
color(green).
color(blue).

然後,定義著色規則。


colorify(A,B,C,D,E) :-
color(A), color(B), color(C), color(D), color(E),
\+ A=B, \+ A=C, \+ A=D, \+ A=E,
\+ B=C, \+ C=D, \+ D=E.

上面代碼中,colorify(A,B,C,D,E)是一個對 ABCDE 五個變量求值的表達式。該表達式為true的條件是,這五個變量各自為一種顏色,則相鄰的變量不相等。

最後,這兩段代碼合在一起,組成一個腳本map.pl,再加載這個腳本。


?- [map].
true.

執行表達式colorify(A,B,C,D,E),SWI-Prolog 就會將三種顏色依次賦值給變量,測試哪些組合是可能的結果。


?- colorify(A,B,C,D,E).
A = red,
B = D, D = green,
C = E, E = blue;
A = red,
B = D, D = blue,
C = E, E = green ;
A = green,
B = D, D = red,
C = E, E = blue ;
A = green,
B = D, D = blue,
C = E, E = red ;
A = blue,
B = D, D = red,
C = E, E = green ;
A = blue,
B = D, D = green,
C = E, E = red ;

可以看到,計算機給出了6組解,即有6種可行的地圖著色方法。

四、誰是兇手

下面看一個比較有趣的邏輯題。

Boddy 先生死於謀殺,現有六個嫌疑犯,每個人在不同的房間,每間房間各有一件可能的兇器,但不知道嫌疑犯、房間、兇器的對應關係。請根據下面的條件和線索,找出誰是兇手。

已知條件:六個嫌疑犯是三男(George、John、Robert)三女(Barbara、Christine、Yolanda)。


man(george). man(john). man(robert).
woman(barbara). woman(christine). woman(yolanda).

為了後面解題的方便,需要把"男人"和"女人"都定義為"人"。


person(X):- man(X).
person(X):- woman(X).

六個嫌疑犯分別待在六個房間:浴室(Bathroom)、飯廳(Dining Room)、廚房(Kitchen)、起居室(Living Room)、 儲藏室(Pantry)、書房(Study)。每間房間都有一件可疑的物品,可以當作兇器:包(Bag)、火槍(Firearm)、煤氣(Gas)、刀(Knife)、毒藥(Poison)、繩索(Rope)。


location(bathroom). location(dining). location(kitchen).
location(livingroom). location(pantry). location(study).
weapon(bag). weapon(firearm). weapon(gas).
weapon(knife). weapon(poison). weapon(rope).

下面聲明一條規則,每個房間的人都是不一樣的。


uniq_ppl(A,B,C,D,E,F):-
person(A), person(B), person(C),
person(D), person(E), person(F),
\+A=B, \+A=C, \+A=D, \+A=E, \+A=F,
\+B=C, \+B=D, \+B=E, \+B=F,
\+C=D, \+C=E, \+C=F,
\+D=E, \+D=F,
\+E=F.

然後,定義一個表達式murderer(X),變量X就是兇手。該表達式只有滿足以下所有條件,才可能為true。


murderer(X) :-
uniq_ppl(Bathroom, Dining, Kitchen, Livingroom, Pantry, Study),
uniq_ppl(Bag, Firearm, Gas, Knife, Poison, Rope),

注意,上面代碼中Bathroom和Bag這樣的字符串,都是大寫字母開頭,所以都是變量,代表對應的人。至於具體是誰,就要通過推理得到。

線索一:廚房裡面是一個男人,那裡的兇器不是繩索、刀子、包和火槍。


man(Kitchen),
\+Kitchen=Rope, \+Kitchen=Knife, \+Kitchen=Bag, \+Kitchen=Firearm,

線索二:Barbara 和 Yolanda 在浴室和書房。


woman(Bathroom), woman(Study),
\+christine=Bathroom, \+christine=Study,
\+barbara=Dining, \+barbara=Kitchen,
\+barbara=Livingroom, \+barbara=Pantry,
\+yolanda=Dining, \+yolanda=Kitchen,
\+yolanda=Livingroom, \+yolanda=Pantry,

線索三:帶包的那個人不是 Barbara 和 George,也不在浴室和飯廳。


\+barbara=Bag, \+george=Bag,
\+Bag=Bathroom, \+Bag=Dining,

線索四:書房裡面是一個帶繩子的女人。


woman(Rope), Rope=Study,

線索五:起居室裡面那件兇器,與 John 或 George 在一起。


man(Livingroom), \+Livingroom=robert,

線索六:刀子不在飯廳。


\+Knife=Dining,

線索七:書房和食品儲藏室裡面的兇器,沒跟 Yolanda 在一起。


\+yolanda=Pantry, \+yolanda=Study,

線索八:George 所在的那間屋子有火槍。


Firearm=george,

線索九:Boddy 先生死在食品儲藏室裡,那裡的兇器是煤氣。


Pantry=Gas, Pantry=X, Gas=X,

線索就是上面這些,然後把寫好的所有表達式放在一起,組成一個完整的腳本crime.pl,代碼看這裡。

加載這個腳本,執行murderer(X)函數,由於條件複雜,運算時間較長,最終會顯示兇手是誰。


?- [crime].
true.

?- murderer(X).
KILLER IS :christine
Bathroom: yolanda
Dining: george
Livingroom: john
Pantry: christine
Study: barbara
Kitchen: robert
Knife: yolanda
Gas: christine
Rope: barbara
Bag: john
Poison: robert
Firearm: george
X = christine ;

(完)

參考:https://www.ruanyifeng.com/blog/2019/01/prolog.html

https://xmonader.github.io/prolog/2018/12/21/solving-murder-prolog.html

相關焦點

  • 從prolog到LTN,AI的邏輯推理能力1
    本文整理了邏輯編程、prolog語言快速入門、LTN的核心思想,分享給大家。01邏輯編程是什麼?只要給出事實和規則,它會自動分析其中的邏輯關係,然後給出答案。它描述了解決方案而不是計算步驟。基於該描述,計算機解決了該問題。
  • 前言 簡介
    約翰(Johan)當時正在教Prolog入門課程,他正在與Patrick一起基於Prolog的自然語言語義入門課程,他決定編寫關於Prolog的簡短講義,也可以用作計算語義學書籍的附錄。    不錯的主意,但這並不是事情的解決方法。首先,在1996和2000年,Patrick和Johan重新考慮了Prolog的結構課程,然後筆記變成書本大小。
  • Swift語言入門視頻教程:簡介及開發環境搭建
    蘋果公司在今年的WWDC大會上發布了全新程式語言Swift,Swift語言的發布對於開發者們,尤其是iOS開發者們來說確實是蘋果開發者大會的一大亮點。我們可以預想到未來的iOS開發招聘信息很可能會變成「招聘iOS程式設計師,要求擁有5年的Swift語言開發經驗」。
  • Swift語言開發入門視頻教程:playground基本用法
    Swift語言開發入門視頻教程:playground基本用法 蘋果公司在今年的WWDC大會上發布了全新程式語言Swift,Swift語言的發布對於開發者們,尤其是iOS開發者們來說確實是蘋果開發者大會的一大亮點
  • 北京語言大學英語專業簡介
    北京語言大學英語專業簡介  英語專業  英語語言文學方向主要課程設置  專業必修課:精讀、泛讀、語法、寫作、聽力、口語、演講與辯論、英語國家概況、高級英語閱讀、高級寫作、英美文學史
  • prolog中文教程及語法規則
    如果你是一位prolog的新手,希望你首先閱讀這篇文章,好對prolog的全局有個了解,本文將詳細介紹prolog學習流程編程思路上以及prolog語法細節。,那麼問題就是目標狀態.所以, Prolog 語言實際是一種應用相當廣泛的智能程序設計語言.從上面最後一個目標可以看出,同過程性語言相比,對於一個 Prolog 程序,其問題就相當於主程序,其規則就相當於子程序,而其事實就相當於數據.
  • 彙編語言入門
    雖然現在市面上關於彙編語言的書籍資料無窮多,卻無從下手?
  • Wolfram語言入門
    當我們在1988年首次發布Mathematica(Wolfram語言的前身)時,我出版過一本關於該系統的教程簡介和參考指南.該書受到了廣泛的好評,並且我認為其對Mathematica的早期成功貢獻良多,這便是眾所周知的 The Mathematica Book .在接下來的十多年中,該書經歷了五次再版,內容也隨之增加到了接近1500頁的長度.
  • 【獨家】自然語言處理(NLP)入門指南
    在您一頭扎進去閱讀本文之前,請注意,下面列表只是提供了非常通用的入門清單(有可能不完整)。 為了幫助讀者更好地閱讀,我在括號內添加了簡短的描述並對難度做了估計。最好具備基本的編程技能(例如Python)。
  • iPhone Swift語言雨燕中文手冊入門教程
    iPhone Swift語言雨燕中文手冊入門教程 來源:www.18183.com作者:集落時間:2014-06-03 6月3日消息,蘋果公司於北京時間今日凌晨1時舉行全球開發者大會
  • 蘋果Swift語言入門教程【中文版】
    目錄1 簡介2 Swift入門3 簡單值>4 控制流5 函數與閉包6 對象與類7 枚舉與結構1   簡介今天凌晨他是工業級品質的系統程式語言,卻又像腳本語言一樣的友好。他支持playground,允許程式設計師實驗一段Swift代碼功能並立即看到結果,而無需麻煩的構建和運行一個應用。Swift集成了現代程式語言思想,以及Apple工程文化的智慧。編譯器是按照性能優化的,而語言是為開發優化的,無需互相折中。(by gashero)可以從"Hello, world"開始學起並過渡到整個系統。
  • 程序設計入門——C語言
    【課程簡介】:程序設計是一門基礎課程。對於計算機相關專業而言,程序設計是專業基礎知識,是進一步學習其他專業知識的第一步階梯;對於非計算機專業而言,程序設計的學習有助於理解計算機的能力所在,理解哪些是計算機擅長解決的問題,怎樣的方式方法是計算機擅長的手段,從而能更好地利用計算機來解決本專業領域內的問題。
  • 格拉斯哥卡利多尼安大學快速入門指南簡介
    下面南昌留學雲小編為大家介紹格拉斯哥卡利多尼安大學快速入門指南簡介!拉斯哥卡利多尼安大學快速入門指南之申請流程1.確定申請專業2.準備所有申請材料,如個人陳述、簡歷、推薦信、學歷證明等3.提交申請材料和在線網申4.順利的拿到學校offer
  • 蘋果Apple Swift程式語言中文版入門教程
    蘋果Apple Swift程式語言中文版入門教程 來源:www.18183.com作者:集落時間:2014-06-03 蘋果在WWDC第一天早晨的kyenote中說道全新的開發者程式語言
  • 紫荊PT站種子簡介寫作入門
    這裡,提供一些入門教程,方便站內快速、高效地寫出合格的種子簡介。BBCodePT站大多使用的是輕量標記語言BBCode,紫荊PT亦是如此。實用工具PTGen快速填寫電影、劇集的簡介紫荊對於影視種子的簡介有格式要求,下面的工具就可以快速解決這個問題。簡介PTGen是由R醬(rhilip)[3]開發的Pt站資源簡介生成工具[4]。
  • 電腦入門程式語言
    今天和大家介紹一下電腦入門編程學什麼語言更合適。首選python語言,python 是一門開源免費、通用型的腳本程式語言,現在社會上會python語言的人很吃香的。它上手簡單,功能強大,堅持「極簡主義」。
  • 韓語入門學習資料下載
    大小:198788| 平臺:Win9x/NT/2000/XP/2003| 授權:免費版| 軟體評級:★★★版本:| 語言:英文| 人氣:0| 軟體類別:國產軟體更新時間:2016-11-3 14:13:59零基礎:韓語發音入門王[簡介]【韓語】零基礎:韓語發音入門王【中譯出版】【ISBN 9787500143659】【MPR文件】零基礎韓語發音入門王
  • NLP研究入門之道:自然語言處理簡介
    推薦清華大學劉知遠老師的Github項目:NLP研究入門之道Github地址,可點擊閱讀原文直達:https://github.com
  • Python語言如何入門
    閱讀本文大概需要5分鐘:Python 語言應該如何入門,記得我幾年前也碰到過這樣的問題,當時網上隨便搜了一下飢不擇食的找了一些書開始啃起來,結果發現很疑惑,感覺吃力,走了很多彎路。若不得法還會降低初學者的興趣,現在我就說說自己對python 入門的理解.學Python和學其他的語言其實是相同的,我給新同事講課的時候就說學編程和練武功其實是很相似,入門大致這樣幾步:找本靠譜的書,找個靠譜的師傅,找一個地方開始練習。 學語言也是的:選一本通俗易懂的書,找一個好的視頻資料,然後自己裝一個IDE工具開始邊學變寫。
  • 導函數的兩大特性及「導函數大家庭」簡介(高等數學入門系列拓展閱讀)
    系列簡介:這個系列文章講解高等數學的基礎內容,注重學習方法的培養,對初學者不易理解的問題往往會不惜筆墨加以解釋。