在學習了前三章內容后,我們應該對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。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。