Prolog计算两城市距离报错求助:语法错误及实现问题
解决Prolog中计算城市直线距离的语法错误问题
错误原因分析
你遇到的ERROR: Syntax error: Operator expected是因为Prolog不支持**作为幂运算操作符——这个符号在Python等语言中常用,但Prolog的标准幂运算符是^,或者你也可以直接用数值自乘的方式计算平方,两种写法都能被Prolog正确解析。
修正后的完整代码
% 存储城市状态:[城市名称, [X坐标,Y坐标], 邻接城市列表] cityState([[a,[2,3],[b,d]],[b,[5,1],[a,c,d]], [c, [3, 2], [b, d]], [d, [6, 3], [a, b, c]]]). % 查询城市的位置和邻接列表 city(Name,Position,Neighbors):- cityState(L), member([Name,Position,Neighbors],L), !. % 单独查询城市坐标 position(Name,Position):- city(Name,Position,_Neighbors). % 修正后的距离计算谓词(使用Prolog标准幂运算符) distance(City1,City2,Distance):- position(City1,[X1,Y1]), position(City2,[X2,Y2]), X_Dist is (X1-X2) ^ 2, Y_Dist is (Y1-Y2) ^ 2, Distance is sqrt(X_Dist + Y_Dist).
如果你觉得幂运算符不够直观,也可以用乘法替代,效果完全一致:
% 用自乘计算平方的版本 distance(City1,City2,Distance):- position(City1,[X1,Y1]), position(City2,[X2,Y2]), DX is X1 - X2, DY is Y1 - Y2, X_Dist is DX * DX, Y_Dist is DY * DY, Distance is sqrt(X_Dist + Y_Dist).
测试运行结果
现在执行distance(a,b,Distance).就能得到正确的欧几里得距离:
Distance = 3.605551275463989.
这个结果对应sqrt((2-5)² + (3-1)²) = sqrt(13)的计算值,完全符合预期。
内容的提问来源于stack exchange,提问作者A_I
相关产品推荐
相关产品推荐

