Prolog 語言入門

2021-10-07 10:59:48 字數 4601 閱讀 2491

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...