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
相关产品推荐
相关产品推荐

