如何编写Prolog谓词计算物品列表的权重总和?
解决方法
方法1:直接在total_weight中计算总和
你可以直接修改total_weight谓词,让它递归时直接累加权重,无需额外生成权重列表再求和,代码更简洁高效:
weight(mum,60). weight(dad,85). weight(alfie,20). weight(bianca,25). weight(daisy,50). weight(puppy,10). % 空列表的总权重为0 total_weight([], 0). % 递归计算:先算剩余列表的总和,再加上当前物品的权重 total_weight([H_entity | T_entity], Total) :- weight(H_entity, H_weight), total_weight(T_entity, RestTotal), Total is H_weight + RestTotal.
调用total_weight([mum,dad,puppy], W)就会得到W = 155,完全匹配你的需求。
方法2:结合现有两个谓词
如果想保留已有的list_sum和权重列表生成逻辑,可以调整谓词分工,新增衔接逻辑:
weight(mum,60). weight(dad,85). weight(alfie,20). weight(bianca,25). weight(daisy,50). weight(puppy,10). list_sum([],0). list_sum([Head|Tail], TotalSum):- list_sum(Tail, Sum1), TotalSum is Head+Sum1. % 专门生成权重列表的谓词 entity_weights([], []). entity_weights([H_entity | T_entity], [H_weight | T_weight]) :- weight(H_entity, H_weight), entity_weights(T_entity, T_weight). % 新的total_weight:先获取权重列表,再求和 total_weight(Entities, Total) :- entity_weights(Entities, Weights), list_sum(Weights, Total).
调用total_weight([mum,dad,puppy], W)同样会返回W = 155。
原代码问题说明
你原来的total_weight返回的是权重列表(比如调用后会得到W = [60,85,10]),而非总和,所以需要把列表求和逻辑与它结合,或者直接在递归过程中完成累加。
内容的提问来源于stack exchange,提问作者MOT29
相关产品推荐
相关产品推荐

