Prolog传递闭包:迷宫探路者

时间:2016-03-10 21:59:07

标签: prolog transitive-closure

我对实现一个简单的Prolog程序感兴趣,该程序在迷宫结构上执行路径查找。

/* i_ -> intersections  */
i_(c,b). /* horizontal adjacencies */
i_(g,h).
i_(h,i).
i_(i,g).
i_(a,d). /* vertical adjacencies */
i_(d,g).
i_(c,f).
i_(f,i).

/* symmetric interface */
i(X,Y) :- i_(X,Y);i_(Y,X).

/* path, the rule in question*/
path(X,Y) :- i(X,Y) ; i(X,Z), path(Z,Y).

错误:当路径与输入节点一起使用> = 5步之外时,我的Prolog解释器(SWI)将进入无限递归状态。 但是,该规则可以正常工作,路径中的节点步数少于5个。奇怪的是,省略对称规则(简单地声明每个邻接,向后和向前),将路径的调用限制减少到少于3个节点的差异。重写默认堆栈分配会再次增加堆栈溢出之前的路径范围。

显然,累加器是有序的。我怀疑我的程序在运行时崩溃,因为解释器继续重新访问已在路径中遍历的节点。

我修改了path以包含legal的额外要求,该要求用作累加器:

/* path --> recursive path check */
legal(Z,[]).
legal(Z,[H|T]):- Z\==H, legal(Z,T). 
path(X,Y,T) :- i(X,Y) ; i(X,Z), legal(Z,T), path(Z,Y,[Z|T]).

但是,我现在面临var Z作为'单身人士的问题。

有关如何正确实现累加器以避免过多堆栈调用的任何建议吗?

0 个答案:

没有答案