Prolog谓词遍历网格

时间:2013-10-07 07:13:45

标签: prolog

考虑以下谓词:路径(开始,结束,大小,路径)

开始是列表[row,column]标识的网格中的单元格。 结束是由列表[row,column]标识的网格中的单元格。 大小是给出最大行数和列值的列表。 路径由相邻单元格列表组成,其中相邻的单元格为左/右和上/下。一个 路径没有循环;即一个单元格只能在列表中出现一次。

使用以下查询:路径([1,1],[4,4],[4,4],路径] 。有效路径为:[[1,1] ,[1,2],[1,3],[1,4],[2,4],[2,3],[3,3],[3,4],[4,4]]。

你会如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

这是一个开始。首先定义路径。

path(X,Y,[X,Y]):- edge(X,Y).
path(X,Y,[X|Xs]):- edge(X,W), path(W,Y,Xs).

然后定义边缘:

edge([X,Y], [X1,Y]) :- X1 is X + 1.
edge([X,Y], [X,Y1]) :- Y1 is Y + 1.

现在你的谓词:

grid_path(START, END, LIMIT, SOLUTION) :-
    within_limit(END, LIMIT),
    path(START,END, SOLUTION).

我不想破坏这种乐趣,所以我会留给你。这个解决方案只会产生所有可能的候选者,效率非常低。您可以四处游玩并优化搜索。