prolog 是一種與眾不同的語言,不用來開發軟體,專門解決邏輯問題。比如,"蘇格拉底是人,人都會死,所以蘇格拉底會死"這一類的問題。離散數學中的謂詞量詞那章。
prolog 就是"邏輯程式設計"(programming of logic)的意思。只要給出事實和規則,它會自動分析其中的邏輯關係,然後允許使用者通過查詢,完成複雜的邏輯運算。
windows10+swi-prolog,傻瓜式安裝即可安裝之後找到bin目錄下的swipl-win.exe執行
進入了prolog 執行環境,?-是命令提示符,輸入:write(「hello world」).
prolog 所有語句的結尾都用乙個"點"(.)表示結束,write()是列印函式。
?
- write(
"hello world").
hello world
true
2.退出 swi-prolog,可以使用halt命令,後面加點.
ᔀ?
- halt.
1. 常量與變數: >很簡單,prolog中小寫字母開頭就是常量,大寫字母開頭就是變數(
記得加點)
?
- write(ha)|.
hatrue.
?- write(ha)|.
_2280
true.
關係和屬性
兩個物件之間的關係,使用括號表示。比如,jack 的朋友是 peter,寫成friend(jack, peter).。注意,jack 的朋友是 peter,不等於 peter 的朋友是 jack。如果兩個人都認為對方是朋友,要寫成下面這樣。
friend(jack, peter)
.friend(peter, jack)
.
如果括號裡面只有乙個引數,就表示物件擁有該屬性,比如 mark 是男性,寫成male(mark).。規則
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(y)
.
上面**中,x的母親是y(mother(x, y))取決於兩個條件:y的小孩是x,y必須是女性。只有這兩個條件都為true,mother(x, y)才為true。
如果一條規則取決於某個條件為false,則在條件之前加上+表示否定。
onesidelove(x, y)
:- loves(x, y),\
+ loves(y,x)
.
上面**中,x單相思y,取決於兩個條件。第乙個條件是x喜歡y,第二個條件是y不喜歡x。
查詢我們先建立乙個pl檔案進行測試:hello.pl檔案內容如下:
classmate(tom,tim).
classmate(tom,mark).
classmate(tim,john).
classmate(john,mark).
在swi控制台匯入檔案
[
'f:/swi-prolog/swipl/demo/hello.pl'
].
顯示為true標識匯入成功。
4.1 查詢兩個人是否是同學
?
- classmate(tom,tim)
.true .
?- classmate(tom,john)
.false.
4.2 列出所有的同學關係(查詢所有)
?
- listing(classmate)
.classmate(tom, tim)
.classmate(tom, mark)
.classmate(tim, john)
.classmate(john, mark)
.
4.3 查詢tom的所有同學
classmate(tom,who)
.who = tim
只顯示乙個資料,但是指定的檔案可以看出,期望的結果應該是兩個,此時按n鍵就會顯示下一條。上面的who是變數名,可以隨意更改,只要是大寫字母開始就可以。
1.經典問題-地圖著色問題
我們知道,地圖的相鄰區域不能使用同一種顏色。現在有三種顏色:紅、綠、藍、黃。請問如何為上面這幅地圖著色?首先,定義四種顏色。
color(red)
.color(green)
.color(blue.
color(yellow)
.
然後,定義著色規則。
colorify(a,b,c,d,e,f):-
color(a)
, color(b)
, color(c)
, color(d)
, color(e)
,color(f),\
+ a=b,
\+ a=c,
\+ a=d,
\+ a=e,
\+ a=f
\+ b=c,
\+ b=d,
\+b=f,
\+ d=e,
\+ d=f,
\+ e=f.
上面**中,colorify(a,b,c,d,e,f)是乙個對 abcdef六個變數求值的表示式。該表示式為true的條件是,這五個變數各自為一種顏色,則相鄰的變數不相等。
將上面的**整合到color.pl中
color(red)
.color(green)
.color(blue)
.color(yellow)
.colorify(a,b,c,d,e,f):-
color(a)
, color(b)
, color(c)
, color(d)
, color(e)
,color(f),\
+ a=b,
\+ a=c,
\+ a=d,
\+ a=e,
\+ a=f
\+ b=c,
\+ b=d,
\+b=f,
\+ d=e,
\+ d=f,
\+ e=f.
匯入檔案進行測試:
[
'f:/swi-prolog/swipl/demo/color.pl'].
true.
?- colorify(a,b,c,d,e,f)
.a = red,
b = e, e = green,
c = d, d = blue,
f = yellow ;
a = red,
b = e, e = green,
c = f, f = blue,
d = yellow ;
a = red,
b = e, e = green,
c = f, f = yellow,
d = blue ;
a = red,
b = e, e = green,
c = d, d = yellow,
f = blue ;
a = red,
b = e, e = blue,
c = d, d = green,
f = yellow ;
a = red,
b = e, e = blue,
c = f, f = green,
d = yellow ;
a = red,
b = e, e = blue,
c = f, f = yellow,
d = green ;
好吧。方式確實很多,小夥伴們可以測試一下三個顏色的結果(o(∩_∩)o)!!!
參考:
prolog程式設計 1
prolog是programming in logic的縮寫,意思是使用邏輯進行程式設計的語言,在人工智慧領域被廣泛使用。在學習prolog前我們需要乙個直譯器,我選擇的是swi prolog,可以從 在這一章我們將通過例子展示prolog程式設計的基本思想,但是首先我們要先來學習下怎樣使用prol...
Prolog教程 6 規則
pred x pred y pred z 前面我們已經說過,謂詞是使用一系列的子句來定義的。以前我們所學習的子句是事實,現在讓我們來看看規則吧。規則的實質就是儲存起來的查詢。它的語法如下 head body 其中,head 是謂詞的定義部分,與事實一樣,也包括謂詞名和謂詞的引數說明。連線符,一般可以...
語義網之PROLOG本質
1 prolog程式按下面目標的一般形式由事實和規則組成 p p1,p2,pn.表示合取 表示析取 其中,p是規則的頭,pk是子目標。當且僅當所有子目標滿足,頭目標p才能滿足。可理解為if。這種表達稱為horn子句 如果是 可理解,當這些子目標至少滿足乙個就可以了 2 舉例 parent x,y f...