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

2018-02-24 16:03 更新

單詞謎題

在進(jìn)行下一章之前,我想先把上一章加分習(xí)題的第二題答案給大家揭曉一下,因?yàn)榕_(tái)北小碼農(nóng)給我反應(yīng)說(shuō)這一道題有點(diǎn)難了,連學(xué)過(guò)Prolog的人都不一定會(huì)做。確實(shí),這是一道難題,但是這道題的難點(diǎn)不在于程序本身邏輯上的復(fù)雜或者是用到了什么高級(jí)的語(yǔ)法,這道題的難點(diǎn)在于你必須要清楚地理解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).

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

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

之后,我們加上豎直的三個(gè)單詞:

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”,依次類推,我們可以把所有的約束都寫(xiě)出來(lái)。這樣,我們就告訴Prolog系統(tǒng)最后的答案長(zhǎng)得什么樣兒了。有了答案的形式,Prolog就會(huì)用我之前提到的三個(gè)策略(回溯,變量重命名,模式匹配)來(lái)找出答案。

程序的意義

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

mother(pam,bob).

這句程序語(yǔ)句陳述了一個(gè)事實(shí):pam是bob的媽媽。再看:

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

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

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

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.

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

其實(shí),就Prolog本身的意義來(lái)說(shuō),編寫(xiě)Prolog程序的時(shí)候是不提倡加入太多的過(guò)程性意義的,盡量要以描述性意義為主,因?yàn)镻rolog本身就是一個(gè)描述性語(yǔ)言。但是,程序員們?cè)趯?shí)際開(kāi)發(fā)的時(shí)候發(fā)現(xiàn),他們離不開(kāi)過(guò)程性意義的程序,因?yàn)楝F(xiàn)實(shí)生活中解決問(wèn)題本身就是需要步驟的,例如你想從北京到泰安,你要先從北京到天津,然后從天津到滄州,然后從滄州到濟(jì)南,最后從濟(jì)南到泰安。所以,在Prolog里面就不可避免的出現(xiàn)過(guò)程性意義為主的程序。

加分習(xí)題

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

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

    之后,試著解釋一下你寫(xiě)的程序的過(guò)程性意義和陳述性意義。

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)