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

Prolog如何从usersData中提取指定用户体重并实现更新时的体重对比反馈

Prolog用户体重更新功能实现方案

1. 新增辅助查询谓词

首先需要实现根据用户ID提取原有体重的逻辑,添加如下代码:

% 从动态存储的用户列表中查询指定ID用户的原有体重
getOldWeight(Id, OldWeight) :-
    usersData(AllUsers),
    % 匹配对应ID的用户结构,提取体重字段
    member(user(Id, _, _, OldWeight, _, _, _), AllUsers),
    % 匹配成功后截断,避免不必要的回溯
    !.

2. 改造updateWeight谓词

你需要把体重查询逻辑放在更新操作之前,否则更新后无法拿到原有体重,修改后的完整代码如下:

updateWeight(Data):-
    write('请输入你的用户ID: '), nl,
    readNumber(Id),nl,
    % 先查询获取原有体重
    getOldWeight(Id, OldWeight),
    write('请输入当前体重: '), nl,
    readNumber(NewWeight),nl,
    % 对比体重计算差值并输出提示
    (   NewWeight > OldWeight
    ->  WeightDif is NewWeight - OldWeight,
        write('你已经增重了'), write(WeightDif), write('公斤'), nl
    ;   WeightDif is OldWeight - NewWeight,
        write('你已经减重了'), write(WeightDif), write('公斤'), nl
    ),
    % 执行体重更新操作
    setWeight(Id, NewWeight), nl,nl,
    write('体重更新成功!'),nl,nl,
    write('按回车键返回主菜单'),
    readString(_),
    begin(Data).

3. setWeight谓词参考实现(如果未实现可直接使用)

如果你的setWeight还没写完,可以用下面的实现,完成对动态谓词usersData的更新:

% SWI-Prolog环境需要先引入lambda库,放在代码开头即可
:- use_module(library(lambda)).

setWeight(Id, NewWeight) :-
    % 取出旧的用户列表
    usersData(OldUsers),
    % 遍历替换对应用户的体重字段
    maplist(\(OldUser)^(NewUser)^(
        OldUser = user(Id, Name, Age, _, Height, Plan, Training)
        -> NewUser = user(Id, Name, Age, NewWeight, Height, Plan, Training)
        ;  NewUser = OldUser
    ), OldUsers, NewUsers),
    % 删除旧的动态谓词,存入新的用户列表
    retractall(usersData(_)),
    assertz(usersData(NewUsers)).

如果不想用lambda库,也可以自己写递归谓词实现用户列表的遍历替换,逻辑是一致的。

内容的提问来源于stack exchange,提问作者Xiao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 18:36:04