在给定id的情况下,如何更新prolog中的特定值?
我有一个项目,用户可以注册并使用这个虚拟健身房的不同资源,比如更新他们的训练、体重和获得饮食输入。用户由一个称为id的数字标识,该id执行这些操作。我想更新一个用户的体重,但到目前为止我不知道该怎么做。以下是我的代码的一些部分: 这将生成一个用户在给定id的情况下,如何更新prolog中的特定值?,prolog,updating,Prolog,Updating,我有一个项目,用户可以注册并使用这个虚拟健身房的不同资源,比如更新他们的训练、体重和获得饮食输入。用户由一个称为id的数字标识,该id执行这些操作。我想更新一个用户的体重,但到目前为止我不知道该怎么做。以下是我的代码的一些部分: 这将生成一个用户 buildUser(Id, Name, Age, Weight, Height, Plan, Training, User):- User = user(Id, Name, Age, Weight, Height, Plan, Training).
buildUser(Id, Name, Age, Weight, Height, Plan, Training, User):-
User = user(Id, Name, Age, Weight, Height, Plan, Training).
用户存储在这里
usersData([]).
:-dynamic usersData/1.
以下是更新培训的谓词:
setWeight(Id, NewWeight):-
retract(user(Id, Name, Age, _, Height, Plan, Training)),
assert(user(Id, Name, Age, NewWeight, Height, Plan, Training)).
updateWeight(Data):-
write('What's your id?: '), nl,
readNumber(Id), nl,
write('What is your current weight?'), nl,
readNumber(NewWeight),
setWeight(Id, NewWeight),
begin(Data).
然而,我非常清楚收回/断言不起作用。有什么建议吗?我真的很难用prolog
非常感谢您的回答。假设您有效地存储在usersData/1中,那么方法可能是
setWeight(Id, NewWeight):-
retract(usersData(user(Id, Name, Age, _Weight, Height, Plan, Training))),
assert(usersData(user(Id, Name, Age, NewWeight, Height, Plan, Training))).
但我认为最好将数据存储在user/7中:
:- dynamic user/7.
setWeight(Id, NewWeight):-
retract(user(Id, Name, Age, _Weight, Height, Plan, Training)),
assert(user(Id, Name, Age, NewWeight, Height, Plan, Training)).
SWI Prolog语法突出显示将帮助您跟踪程序中动态谓词的正确字段数。此外,还有对用例的库支持,简化了数据库谓词的维护。请参见库()和库()
编辑
重读这个问题,我认为我上面的第一个片段不可能在现场。也许这正是你想要的
setWeight(Id, NewWeight):-
retract(usersData(UsersCur)),
append(X,[UserCur|Y],UsersCur),
UserCur=user(Id, Name, Age, _Weight, Height, Plan, Training),
UserUpd=user(Id, Name, Age, NewWeight, Height, Plan, Training),
append(X,[UserUpd|Y],UsersUpd),
assert(usersData(UsersUpd)).
现在很明显,存储用户/7更好
编辑
您应该注意一个问题:setWeight(UnknownId,41;
将破坏数据库,因为retract
将保留相应的assert
。所以我们需要的是
setWeight(Id, NewWeight):-
retract(usersData(UsersCur)),
( append(X,[UserCur|Y],UsersCur),
UserCur=user(Id, Name, Age, _Weight, Height, Plan, Training)
-> UserUpd=user(Id, Name, Age, NewWeight, Height, Plan, Training),
append(X,[UserUpd|Y],UsersUpd)
; UsersUpd=UsersCur
),
assert(usersData(UsersUpd)).
它创造了奇迹。你真的救了我,先生。非常感谢。