我正在尝试学习Prolog,并且正在进行练习以尝试理解递归的工作原理。数据库如下:
directTrain(saarbruecken,dudweiler).
directTrain(forbach,saarbruecken).
directTrain(freyming,forbach).
directTrain(stAvold,freyming).
directTrain(fahlquemont,stAvold).
directTrain(metz,fahlquemont).
directTrain(nancy,metz).
这是与立即学习Prolog中的练习3.3相同的数据库! 目标是定义一个溯源函数travel / 3,它将为查询travel(nancy,stAvold,X)提供以下输出:
?- travel(nancy,stAvold,X).
X = go(nancy,metz,
go(metz,fahlquemont,
go(fahlquemont,stAvold)))
这是我到目前为止想出的(我最清晰的代码段):
travel(A, B, X) :-
directTrain(A, B).
travel(A, B, go(X)) :-
directTrain(A, Z),
travel(Z, B, go(A,Z)).
这确实认识到,当我们找到stAvold的路径时,递归应该停止。但是我真的很难以正确的格式将输出堆叠在go()函数中。我尝试了许多不同的方法,但似乎无法正确解决。坚持了几个小时。如果有人可以提供提示或示例,我将不胜感激。
干杯!