Learn Prolog Now 翻譯 - 第三章 - 遞歸 - 第四節,更多的實踐和練習


 在學習了前三章內容后,我們應該對Prolog編程有了直觀和理性的認識。由於合一、變量初始化、證明搜索和遞歸都是Prolog的核心概念,所以有如下更多的一些實踐和練習。

這里我會先錄入題目,后期再給出我自己的程序代碼和一些思考。

 

實踐1

 試想有如下的描述迷宮的知識庫。其中的事實描述了點和點之間的聯通關系,即connected/2謂詞邏輯給出了這樣的事實:迷宮中能從參數1的點,直接到達參數2的點。而且,

聯通關系是有方向的、單向不能往返的:

connected(1,2). 
   connected(3,4). 
   connected(5,6). 
   connected(7,8). 
   connected(9,10). 
   connected(12,13). 
   connected(13,14). 
   connected(15,16). 
   connected(17,18). 
   connected(19,20). 
   connected(4,1). 
   connected(6,3). 
   connected(4,7). 
   connected(6,11). 
   connected(14,9). 
   connected(11,15). 
   connected(16,12). 
   connected(14,17). 
   connected(16,19).

 請寫出一個謂詞邏輯path/2,給出迷宮中哪些點是能夠聯通(直接或者間接)的。比如,點5是否能夠達到點10?當起點是1時,能夠到達哪些點?

 

實踐2

 有如下的交通信息知識庫:

byCar(auckland, hamilton).
byCar(hamilton, raglan).
byCar(valmont, saarbruecken).
byCar(valmont, metz).

byTrain(metz, frankfurt).
byTrain(saarbruecken, frankfurt).
byTrain(metz, paris).
byTrain(saarbruecken, paris).

byPlane(frankfurt, bangkok).
byPlane(frankfurt, singapore).
byPlane(paris, losAngeles).
byPlane(bangkok, auckland).
byPlane(singapore, auckland).
byPlane(losAngeles, auckland).

 請寫出一個謂詞邏輯travel/2,可以描述從一個地點到達另外一個地點(間接或者直接),可以通過car、train和plane進行換乘。比如,如果查詢:

 ?- travel(valmont, raglan).

 Prolog會回答true。

 

實踐3

 所以,通過實踐2中的謂詞邏輯travel/2,可以知道Valmont可以達到Raglan。這很有用,但是當你計划一段旅行的時候,你希望更確切的一些信息,比如其中詳細的路途是

怎么樣的。請寫一個謂詞邏輯travel/3,可以告訴具體的路徑,比如,如果查詢:

 ?- travel(valmont, losAngeles, X).

 X = go(valmont, metz, go(metz, paris, go(paris, losAngeles)))

 

實踐4

 擴展實踐3中的謂詞邏輯travel/3,使其不僅能夠給出從一個地方到另一個地方的路由,並且能夠給出如何到達的方式。即,新的程序可以讓我們知道,在旅行的每一段,是

使用的car,train還是plane作為交通工作的。

 

實踐5

 寫出一個3元謂詞combine1/3,將頭兩個參數的列表,合並為第三個參數的列表,例如:

   ?- combine1([a, b, c], [1, 2, 3], X).

   X = [a, 1, b, 2, c, 3]

   ?- combine2([f, b, yip, yup], [glu, gla, gli, glo], Result).

   X = [f, glu, b, gla, yip, gli, yup, glo]

 

 寫出一個3元謂詞combine2/3,將頭兩個參數的列表,合並為第三個參數的列表,例如:

   ?- combine2([a, b, c], [1, 2, 3], X).

   X = [[a, 1], [b, 2], [c, 3]]

   ?- combine2([f, b, yip, yup], [glu, gla, gli, glo], Result).

   X = [[f, glu], [b, gla], [yip, gli], [yup, glo]]

 

 寫一個3元謂詞combine3/3,將頭兩個參數的列表,合並為第三個參數的列表,例如:

   ?- combine3([a, b, c], [1, 2, 3], X).

   X = [j(a,1), j(b,2), j(c,3)]

   ?- combine3([f, b, yip, yup], [glu, gla, gli, glo]).

   X = [j(f, glu), j(b, gla), j(yip, gli), j(yup, glo)]

    

 今后的學習中,我會找更多的一些實踐題目,包括著名的數獨問題,四色地圖問題,八皇后問題,漢諾塔問題等等,一一分析。關於這章實踐的答案,會陸續附上。

 

我的答案和解釋:

 

 實踐1的path/2定義如下:

   path(X, Y) :- connected(X, Y).

   path(X, Y) :- connected(X, Z), path(Z, Y).

 思路:首先考慮直接連通的情況,作為基礎子句;然后考慮遞歸:設置一個中間變量Z,X和Z直接連通,然后Z和Y遞歸調用Path。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com