99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

第2章:誰是誰的爸爸

2018-02-24 16:03 更新

家譜

假設我們有這樣一個家譜圖:

我們現在的任務是將這個家譜圖寫成程序代碼的形式。請打開你最喜歡的文本編輯器,輸入以下代碼。

male(di).
male(jianbo).
female(xin).
female(yuan).
female(yuqing).
father(jianbo,di).
father(di,yuqing).
mother(xin,di).
mother(yuan,yuqing).
grandfather(X,Y):-father(X,Z),father(Z,Y).
grandmother(X,Y):-mother(X,Z),father(Z,Y).
daughter(X,Y):-father(X,Y),female(Y).

這段代碼里面的每一行都代表一個子句(clause)。其中帶有“:-”的子句叫做規(guī)則(rule),不帶有”:-“的子句叫做事實(fact)。另外,在Prolog里面諸如”di”和”jianbo”這類以小寫英文字母開頭的名稱我們稱它們?yōu)樵?atom),以大寫英文字母為開頭的名稱我們稱它們?yōu)樽兞?,例如上面程序里面的”X”和”Y”。顧名思義,原子是常量,即它的值是不可變的,而變量的值可以改變。最后需要講的是,在Prolog里面”,”代表邏輯關系中的”且”,我們回在后面的章節(jié)里面看到,”;”代表邏輯關系里面的”或”。

已經被這些名稱搞得頭暈了?沒關系,我會在之后的教程里面詳細的介紹Prolog的數據類型和術語,在這里,你只需有初步的了解即可。

保存上述代碼到你的磁盤的某個地方,例如在Mac系統(tǒng)里,我把它存到“~/prolog/chapter2.pl”,然后依照第一章里面講的那樣,進入SWI-Prolog。在SWI-Prolog里面輸入如下查詢:

?- consult('path/to/your/chapter2.pl').

在我的電腦里,我應該這么輸入:

?- consult('~/prolog/chapter2.pl').

這里”consult”的意思是讓SWI-Prolog加載你編寫的程序,然后編譯它。輸入完這句查詢以后,敲擊回車鍵,你應該得到如下輸出:

% /Users/fengdi/prolog/chapter2.pl compiled 0.00 sec, 3,816 bytes
true.

如果你得到了上述的輸出,那么恭喜你,你的第一個程序完成了。如果你得到的是其他的錯誤的輸出,請重新檢查你的程序代碼是否輸入正確(不過要記得,千萬不要因為想要保證代碼輸入的不出錯而直接復制粘貼代碼,那樣的話你學不到真正的東西)。下面,讓我們考驗一下我們的SWI-Prolog現在都知道些什么。在SWI-Prolog里面輸入下面一個查詢:

grandfather(X,yuqing).

令人驚訝的事情發(fā)生了!你得到了下列輸出:

X = jianbo.

你的電腦告訴你,”yuqing”的祖父是”jianbo”。現在請看之前我們編寫的”chapter2.pl”程序代碼,我們在程序里根本沒有明確的說明誰是誰的祖父,我們只是給了一個規(guī)則:

grandfather(X,Y):-father(X,Z),father(Z,Y).

我們說,當X是Z的父親并且Z是Y的父親的時候,X是Y的祖父。然后我們問,yuqing的祖父是誰,Prolog就能自動幫我們找到答案!

下面再看一個例子:

parent(keyuan,jianbo).
parent(jianbo,di).
parent(di,yuqing).

ancestor(X,Y):-parent(X,Y).
ancestor(X,Y):-parent(X,Z),ancestor(Z,Y).

在這個例子里面,我們定義了一個回溯的規(guī)則”ancestor”,規(guī)則可以這樣解讀:我們可以說X是Y的祖先基于兩個條件:X是Y的parent,或者存在一個Z,使得X是Z的parent并且Z是Y的祖先。請讀者仔細的想一下,是不是這個道理呢?為了證明我們的程序的正確性,我們輸入一下查詢:

?- ancestor(keyuan,yuqing).

Prolog會返回:

true.

這證明了我們的程序是正確的,因為根據常識,keyuan是yuqing的曾祖父,所以keyuan是yuqing的祖先。

好了,今天的新內容就講到這里,下面是一個習題,你可以自己試驗一下。

加分習題

  1. 試著用Prolog描述一下你的家譜,并且做一些簡單的查詢。(小提示:在編寫你的家譜的時候,你可以試著用一些新的事實,比如:”sister(your_sister,you)”“brother(your_brother,you)”等等)
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號