我在Prolog中编写的程序的一部分与查找从起始位置到结束位置的所有可能路径选项有关。
这是我到目前为止所做的:
findAllRoutes(Start, End, Path) :-
findAllRoutes(Start, _, End, Path),
print('Successful route: '), print(Route).
findAllRoutes(End, _, End, [End]). %route was successfully finished
findAllRoutes(Start, Temp, End, [Start|Rest_of_List]) :-
path(Start, Temp),
findAllRoutes(Temp, _, End, Rest).
以下是要读取的数据:
%path(Start, End).
path(1, 4). %find all the possible paths from location 1 to location 4.
%paths_in_place[[Start, End, Distance]].
paths_in_place[[1, 2, 250], [2, 4, 250], [1, 3, 400], [3, 4, 300]].
我的问题是,这是一种在paths_in_place
之间循环的准确方法,同时还保存从起始位置到结束位置的路上达到的点数顺序吗?
此外,Distance
在调用findAllRoutes
而没有提及Distance
字段时会发生什么?即使Start, End, Route
字段为paths_in_place
,在Prolog中传递Start, End, Distance
的参数是否合法?
非常感谢任何帮助。如果我需要澄清任何内容,请告诉我。
答案 0 :(得分:1)
Prolog数据具有象征意义。您可以以米为单位传递距离,并将其视为距离(以英尺为单位)。这就是火星任务之一如何崩溃,尽管他们使用了另一种语言。所以最终取决于你。
关于你的代码,
findAllRoutes(Start, End, Path) :-
findAllRoutes(Start, _, End, Path),
print('Successful route: '), print(Route).
Route
? Route
是什么?这是一个未经实例化的“单例”变量。 SWI Prolog警告我们这样做。也许你的意思是Path
。
findAllRoutes(End, _, End, [End]). % route was successfully finished
findAllRoutes(Start, Temp, End, [Start|Rest_of_List]) :-
path(Start, Temp),
findAllRoutes(Temp, _, End, Rest).
再次,Rest_of_List
和Rest
可能应该具有相同的名称(是相同的逻辑变量)。
否则它看起来没问题,除了它的名字:它在每次调用/回溯时找到一条路径,而不是“AllRoutes”。名称“AllRoutes”表示它找到所有这些并在结果参数中返回它们;不是。
然后是您的数据,它与您的代码不同步:
%path(Start, End).
path(1, 4). %find all the possible paths from location 1 to location 4.
%paths_in_place[[Start, End, Distance]].
paths_in_place([[1, 2, 250], [2, 4, 250], [1, 3, 400], [3, 4, 300]]).
% ! must be in parentheses !
您的代码中path(Start, Temp)
来电显示Temp
是Start
的直接继承者。根据这些数据不是这样。另外,缺少path/2
定义。但是你可以只用一堆事实代替列表来定义数据。