我有兴趣实现一个简单的 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]).
但是,我现在面临 varZ
作为“单例”的问题。
关于如何正确实现累加器以避免过多的堆栈调用的任何建议?