我对实现一个简单的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
作为'单身人士的问题。
有关如何正确实现累加器以避免过多堆栈调用的任何建议吗?