Prolog A*搜索函数中addAChild基准情况匹配失败求助
分析你的Prolog addAChild查询失败问题
我来帮你捋捋为啥这个查询失败了——核心问题出在Prolog的模式匹配逻辑上:
你定义的基准规则是:
addAChild([Child],[],[Child]):- write(woo empty).这个规则对参数的要求很明确:第一个参数必须是仅包含一个元素的列表(
[Child]的模式),第二个参数是空列表,第三个参数会被绑定为同样的单元素列表。但你执行的查询是:
addAChild([c(1,1,p(1,2)),[]],[],A).这里第一个参数是包含两个元素的列表(
c(1,1,p(1,2))和[]),完全不符合规则里[Child]的模式——Prolog找不到能匹配这个查询的子句,自然直接失败了。
怎么修复?
得根据你A*搜索里的实际需求调整规则模式:
如果你的意图是「当第二个参数为空列表时,直接返回第一个参数作为结果」,把规则改成这样:
addAChild(Children,[],Children):- write(woo empty).这样不管第一个参数是单元素还是多元素列表,只要第二个参数是空,就能触发规则。执行你的查询后,会输出
woo empty,同时A会被绑定为[c(1,1,p(1,2)),[]]。如果你的规则本来是想处理第一个参数为单个元素(而非列表),那调整第一个参数的模式:
addAChild(Child,[],[Child]):- write(woo empty).这时候执行
addAChild(c(1,1,p(1,2)),[],A).就会成功,A会被绑定为[c(1,1,p(1,2))]。
你可以结合自己A*搜索的业务逻辑,选对应的调整方式~
内容的提问来源于stack exchange,提问作者Shasocais
相关产品推荐
相关产品推荐

