第4章:Prolog程序的兩種意義

2018-02-24 16:03 更新

單詞謎題

在進行下一章之前,我想先把上一章加分習(xí)題的第二題答案給大家揭曉一下,因為臺北小碼農(nóng)給我反應(yīng)說這一道題有點難了,連學(xué)過Prolog的人都不一定會做。確實,這是一道難題,但是這道題的難點不在于程序本身邏輯上的復(fù)雜或者是用到了什么高級的語法,這道題的難點在于你必須要清楚地理解Prolog程序的意義才能得出答案。好了,先給大家看一下答案的程序:

solution(L1,L2,L3,L4,L5,L6,L7,L8,L9,L10,L11,L12,L13,L14,L15,L16):-
    word(L1,L2,L3,L4,L5),
    word(L9,L10,L11,L12,L13,L14),
    word(L1,L6,L9,L15),
    word(L3,L7,L11),
    word(L5,L8,L13,L16).

以上就是這個單詞謎題的答案。在編寫Prolog程序的時候,之前有編程基礎(chǔ)的朋友一定要摒棄之前編程的習(xí)慣,因為像C,Java這樣的程序語言,程序員解決問題的方式實際上是把解決問題的步驟用程序一步一步地表示出來。換句話說,就是程序員要用程序語言告訴電腦應(yīng)當(dāng)怎樣一步一步地做,才能找到問題的答案。Prolog不是這樣,Prolog程序員讓程序解決一個問題時,只需要把想要得到的答案的形式表述出來,Prolog系統(tǒng)會自動幫你找答案。就像上面這個程序一樣,你告訴Prolog系統(tǒng),答案應(yīng)該是什么樣子的呢?首先,我們要將5個單詞填入表格中,同時,單詞和單詞之間有可能共享同一個英文字母。所以這兒有兩個“約束”,一個約束是單詞字母的個數(shù),第二個約束是單詞里面可以出現(xiàn)的字字母。讓我們先寫水平排列的兩個單詞:

word(L1,L2,L3,L4,L5), <-----單詞1
word(L9,L10,L11,L12,L13,L14)    <-----單詞2

之后,我們加上豎直的三個單詞:

word(L1,L6,L9,L15), <-----單詞3
word(L3,L7,L11),    <-----單詞4
word(L5,L8,L13,L16) <-----單詞5

單詞1和單詞3共享字母“L1”,單詞4和單詞1共享字母“L3”,單詞4和單詞2共享字母“L12”,依次類推,我們可以把所有的約束都寫出來。這樣,我們就告訴Prolog系統(tǒng)最后的答案長得什么樣兒了。有了答案的形式,Prolog就會用我之前提到的三個策略(回溯,變量重命名,模式匹配)來找出答案。

程序的意義

上述的程序其實昭示了Prolog程序的其中一個意義:陳述性意義(declarative meaning)。Prolog程序具有陳述性意義就在于Prolog都是描述的邏輯學(xué)上的一個事實或者是一個規(guī)則。例如:

mother(pam,bob).

這句程序語句陳述了一個事實:pam是bob的媽媽。再看:

grandmother(X,Y):-mother(X,Z),father(Z,Y).

這個語句陳述的是一個規(guī)則:當(dāng)X是Z的母親并且Z是Y的父親時,X是Y的母親。當(dāng)我們在Prolog系統(tǒng)上輸入“grandmother(X,bob)”這樣的查詢時,實際上就是讓Prolog根據(jù)自己知道的邏輯規(guī)則來試圖證明你的查詢。這就是程序的陳述性意義。

程序的第二個意義是過程性意義。想Java和C這樣的語言一樣,Prolog的程序也具有過程性意義,即解決問題的步驟。在舉例子之前,我先講一個在Prolog里面常用的語句:”write”,它的作用是向顯示屏輸出信息。它的參數(shù)可以是任意類型的數(shù)據(jù),數(shù)字,字符串,甚至一個Prolog的規(guī)則都可以直接被輸出。另外一個語句是”nl”,它的作用是使Prolog的屏幕輸出換行。下面給一個程序,你就能理解”write”和”nl”的作用了:

write('I have a dream'),nl,
write('that my four little children will one day live in a nation'),nl,
write('where they will not be judged by the color of their skin'),nl,
write('but by the content of their character.'),nl,
write('This is form Martin Luther King').

Prolog會這樣輸出:

I have a dream
that my four little children will one day live in a nation
where they will not be judged by the color of their skin
but by the content of their character.
This is form Martin Luther King
true.

上面這個程序其實就揭示了Prolog程序的過程性意義,它告訴Prolog系統(tǒng):要想輸出上面這一段話,首先要輸出’I have a dream’,然后換行,接著輸出’that my four little children will one day live in a nation‘,然后換行,依次類推。它實際上是告訴了Prolog系統(tǒng)一個解決問題的步驟。這就是程序的過程性意義。

其實,就Prolog本身的意義來說,編寫Prolog程序的時候是不提倡加入太多的過程性意義的,盡量要以描述性意義為主,因為Prolog本身就是一個描述性語言。但是,程序員們在實際開發(fā)的時候發(fā)現(xiàn),他們離不開過程性意義的程序,因為現(xiàn)實生活中解決問題本身就是需要步驟的,例如你想從北京到泰安,你要先從北京到天津,然后從天津到滄州,然后從滄州到濟南,最后從濟南到泰安。所以,在Prolog里面就不可避免的出現(xiàn)過程性意義為主的程序。

加分習(xí)題

  1. 下面我們來試著把單詞謎題的答案打印的屏幕上,你要寫一個規(guī)則”print_solution“,試著把答案這樣打?。?/p>

     word1 is XXXXXX
     word2 is XXXXXX
     word3 is XXXXXX
     word4 is XXXXXX
     word5 is XXXXXX

    之后,試著解釋一下你寫的程序的過程性意義和陳述性意義。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號