我想出來的行使下列事實在抽象謂詞
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/3
這樣,例如,
travel(valmont, losAngeles, T)
...會找到像這樣的解決方案
T = go(byCar(valmont, metz),
go(byTrain(metz, paris),
go(byPlane(paris, losAngeles)))).
這是我想到的:
travel(X,Y,go(byCar(X,Y))):-byCar(X,Y).
travel(X,Y,go(byTrain(X,Y))):-byTrain(X,Y).
travel(X,Y,go(byPlane(X,Y))):-byPlane(X,Y).
travel(X,Z,go(byCar(X,Y),T)):-byCar(X,Y),travel(Y,Z,T).
travel(X,Z,go(byTrain(X,Y),T)):-byTrain(X,Y),travel(Y,Z,T).
travel(X,Z,go(byPlane(X,Y),T)):-byPlane(X,Y),travel(Y,Z,T).
看來工作...
?- travel(valmont, losAngeles, X).
X = go(byCar(valmont, saarbruecken), go(byTrain(saarbruecken, paris), go(byPlane(paris, losAngeles)))) ;
X = go(byCar(valmont, metz), go(byTrain(metz, paris), go(byPlane(paris, losAngeles)))) ;
false.
...但它傷害了我的眼睛;所有這些重複都是抽象的呼喊。
我試圖通過定義
oneLeg(X,Y):-byCar(X,Y);byTrain(X,Y);byPlane(X,Y).
...並重新定義,以消除重複travel/3
爲
travel(X,Y,go(oneLeg(X,Y))):-oneLeg(X,Y).
travel(X,Z,go(oneLeg(X,Y),T)):-oneLeg(X,Y),travel(Y,Z,T).
...但結果還沒有應用:
?- travel(valmont, losAngeles, X).
X = go(oneLeg(valmont, saarbruecken), go(oneLeg(saarbruecken, paris), go(oneLeg(paris, losAngeles)))) ;
X = go(oneLeg(valmont, metz), go(oneLeg(metz, paris), go(oneLeg(paris, losAngeles)))) ;
false.
我該如何強制更換結果中第oneLeg
個實例e具體的byCar
,byTrain
或byPlane
那「證明」oneLeg
實例?
查看高級謂詞的'call/N'系列。在你的情況下,'call/3'將特別有用。另外,'(= ..)/ 2'也值得一看。 – mat
@mat:謝謝,但是我無法弄清楚你的建議...... – kjo
如果你沒有分成三個不同的表格,但有一個表格有三個參數:從,到,意味着一切都會更容易。然後,如果突然你還需要乘船出海或類似的東西,你不必改變你的計劃。 – 2017-03-03 12:40:14