Prolog出现Arguments not sufficiently instantiated错误求解决
Prolog路径查找代码的“参数未充分实例化”错误修复方案
我是Prolog新手,编写了一段用于查找两点间路径的代码,但编译时出现了Arguments are not sufficiently Instantiated(参数未充分实例化)错误,不知如何修复,特寻求解决方案。
我的代码如下:
edge(o,p1). edge(p1,k). edge(k,l). edge(l,c). edge(c,b). edge(c,w). edge(c,m). edge(l,p2). path(X,Y,Path) :- path(X,Y,[X],Q), reverse(Q,Path). path(X,Y,Visited,[Y|Visited]) :- edge(X,Y). path(X,Y,Visited,Path) :- edge(X,Z), Z \== Y, \+ member(Z,Visited), path(Z,Y,[Z|Visited],Path).
错误信息:Arguments are not sufficiently Instantiated
错误原因
问题出在Z \== Y这一行:\==是必须两边参数都实例化才能正常运行的操作符。如果查询时Y是未绑定的变量(比如调用path(o, Y, P)枚举所有从o出发的路径),此时Y没有具体值,Z \== Y无法完成判断,就会触发“参数未充分实例化”错误。
修复方案
有两种可行的修复方式:
使用
dif/2替换\==
如果你的Prolog环境支持dif/2(比如SWI-Prolog),用dif(Z, Y)替代Z \== Y。dif/2是逻辑层面的不等判断,支持未实例化变量的场景,不会触发实例化错误:path(X,Y,Visited,Path) :- edge(X,Z), dif(Z, Y), \+ member(Z,Visited), path(Z,Y,[Z|Visited],Path).直接删除
Z \== Y判断
实际上,当Z = Y时,第一个子句path(X,Y,Visited,[Y|Visited]) :- edge(X,Y).已经会匹配并处理这种情况,第二个子句不会被触发。因此可以直接删掉Z \== Y这一行,代码依然能正确工作:edge(o,p1). edge(p1,k). edge(k,l). edge(l,c). edge(c,b). edge(c,w). edge(c,m). edge(l,p2). path(X,Y,Path) :- path(X,Y,[X],Q), reverse(Q,Path). path(X,Y,Visited,[Y|Visited]) :- edge(X,Y). path(X,Y,Visited,Path) :- edge(X,Z), \+ member(Z,Visited), path(Z,Y,[Z|Visited],Path).
验证测试
- 调用
path(o, b, P).,会返回正确路径:P = [o,p1,k,l,c,b] - 调用
path(o, Y, P).,可以正常枚举所有从o出发的可达节点及对应路径,不再出现实例化错误。
内容的提问来源于stack exchange,提问作者Elephants unite
相关产品推荐
相关产品推荐

