我正试图在此页的底部完成我的练习,我发现自己在第三题上完全搞不懂。
我们获得了以下旅行信息知识库:
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).要找出两个城市之间是否可以旅行是很简单的。我刚做了这个:
connected(X, Y) :- byCar(X, Y); byTrain(X, Y); byPlane(X, Y).
travel(X, Y) :- connected(X, Y).
travel(X, Z) :- connected(Y, Z), travel(X, Y).然而,当我不得不用变量来统一路径时,我完全糊涂了!
我写了这个:
connected(X, Y) :- byCar(X, Y); byTrain(X, Y); byPlane(X, Y).
connected(Y, Z, Out) :- connected(Y, Z).
travel(X, Y, Out) :- connected(X, Y).
travel(A, Z, Out) :- connected(Y, Z),travel(A, Y, connected(Y, Z, Out)).并被称为travel(valmont, losAngeles,X).
在跟踪过程中,除了末尾的匿名变量外,还有一个点显示正确的路径:
travel(valmont, metz, connected(metz, paris, connected(paris, losAngeles, _17)))
但实际上我不知道如何将它与变量X统一起来!
我真的不能对这件事全神贯注。有人能给我个提示让我朝正确的方向前进吗?只是我失踪了什么的吗?
编辑:
现在我有:
connected(X,Y) :- byCar(X,Y);byTrain(X,Y);byPlane(X,Y).
go(X,Y) :- connected(X,Y).
travel(X,Y,go(X,Y)) :- connected(X,Y).
travel(A,Z,Path) :- travel(Y,Z,Path),go(A,Y,Path).
go(A,Y,Path) :- travel(A,Y,Path).但它会像这样卡住:
4 4 Exit: byPlane(paris,losAngeles) ?
3 3 Exit: connected(paris,losAngeles) ?
2 2 Exit: travel(paris,losAngeles,go(paris,losAngeles)) ?
5 2 Call: go(metz,paris,go(paris,losAngeles)) ?
6 3 Call: travel(metz,paris,go(paris,losAngeles)) ?
7 4 Call: travel(_217,paris,go(paris,losAngeles)) ?
8 5 Call: travel(_242,paris,go(paris,losAngeles)) ?
9 6 Call: travel(_267,paris,go(paris,losAngeles)) ?
10 7 Call: travel(_292,paris,go(paris,losAngeles)) ? 我玩过它,但我不能让它构建整个go(a,b,go(b,c))等等.
发布于 2012-04-19 15:57:43
我将给出递归的基本情况:
travel(X, Y, go(X, Y)) :- connected(X, Y).递归情况看起来非常相似,只不过您正在构建的go/3术语必须有位置作为它的前两个参数,而路径(另一个go/2或go/3项)作为它的第二个参数。
发布于 2014-05-13 13:34:02
我让aBathologist用以下方式向我解释了这一点:
您的目标是获得X= go(valmont,metz,go(metz,paris,go))以响应查询旅行(valmont,losAngeles,X)。
要解决这个问题,旅行/3谓词需要有一个From、To和Path,但是它必须以不带路径的简单go(From,To)结束。简单的出行(从,到)是你旅行/3的基本条件,所以:
travel(X, Y, go(X, Y)) :- connected(X, Y).这正是拉里曼斯所说的。
现在,您需要创建递归旅行/3谓词:
travel(X, Y, go(X, Z, Path)) :-
connected(X, Z),
travel(Z, Y, Path).go/2谓词是多余的,并且有点混乱,因为travel/3谓词有一些类似于go谓词的内容。通过删除go/2谓词,代码更容易阅读和理解。
https://stackoverflow.com/questions/10231815
复制相似问题