SWI-Prolog求列表最大最小元素和:新手代码报错求助
修复你的Prolog最大最小和计算代码
嘿,作为Prolog新手碰到这种问题太正常了,我帮你梳理下代码里的问题,再给你修正后的版本:
你的代码里的几个关键问题
max谓词的第三个子句中,前面的变量是H,但后面误写成了Head,Prolog对变量名大小写敏感,这会导致变量不匹配,逻辑根本执行不下去minlist的第三个子句里,错误调用了max(List, Min1),应该调用minlist(List, Min1),不然会把求最小的逻辑搞成求最大,完全偏离目标sum谓词没写完,正确的逻辑应该是先分别求出列表的最大值和最小值,再把两者相加
修正后的完整代码
% 求列表最大值的谓词 max([H|[]], Max) :- Max is H, !. max([H|T], Max) :- max(T, Max1), Max1 > H, Max is Max1, !. max([H|T], Max) :- max(T, Max1), Max1 < H, Max is H, !. % 求列表最小值的谓词 minlist([Head|[]], Min) :- Min is Head, !. minlist([Head|List], Min) :- minlist(List, Min1), Min1 < Head, Min is Min1, !. minlist([Head|List], Min) :- minlist(List, Min1), Min1 > Head, Min is Head, !. % 计算最大最小和的谓词 sum_max_min(List, Sum) :- max(List, MaxVal), minlist(List, MinVal), Sum is MaxVal + MinVal.
测试示例
你可以在Prolog解释器里这样测试:
?- sum_max_min([3,1,4,1,5], Sum). Sum = 6. % 5(最大)+1(最小)=6
另外,其实像SWI-Prolog这类常用解释器的标准库里,已经自带了max_list/2和min_list/2谓词,如果你不想自己实现求最大最小的逻辑,也可以直接用:
sum_max_min(List, Sum) :- max_list(List, MaxVal), min_list(List, MinVal), Sum is MaxVal + MinVal.
内容的提问来源于stack exchange,提问作者Thegrep1
相关产品推荐
相关产品推荐

