You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:31:08