1

我有兴趣实现一个简单的 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作为“单例”的问题。

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

4

0 回答 0