Prolog基于勾股定理计算城市间距离代码报错求排查
Prolog勾股定理计算城市距离错误排查
两个版本代码的错误原因
第一个版本错误点
- 存在无终止条件的无限递归:代码最后一行再次调用
estimate(State/NextState, DifferentVar),完全没有递归边界,会无限循环调用自身,最终导致匹配失败返回false - 变量赋值逻辑错误:你将坐标差的平方和赋值给了谓词输出参数
Estimate,后续算出的距离值DifferentVar没有绑定到输出参数上,就算没有递归,返回的也只是平方和而非直线距离 - 逻辑冗余:计算两点直线距离不需要递归,直接完成算术运算返回结果即可
第二个版本错误点
- 公式书写错误:勾股定理应为
sqrt( (x1-x2)^2 + (y1-y2)^2 ),你对y坐标差额外多调用了一次sqrt,如果坐标差为负数,sqrt(负数)属于非法运算,会直接返回false导致整个谓词匹配失败
正确实现代码
estimate(State/NextState, Estimate) :- city(State, X/Y), city(NextState, X1/Y1), DX is X1 - X, DY is Y1 - Y, Estimate is sqrt(DX^2 + DY^2).
测试结果
运行查询?- estimate(amsterdam/utrecht, X). 会返回正确结果:X ≈ 34.01 km
内容的提问来源于stack exchange,提问作者Hyakkimaru
相关产品推荐
相关产品推荐

