在给定id的情况下,如何更新prolog中的特定值?

在给定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).

我有一个项目,用户可以注册并使用这个虚拟健身房的不同资源,比如更新他们的训练、体重和获得饮食输入。用户由一个称为id的数字标识,该id执行这些操作。我想更新一个用户的体重,但到目前为止我不知道该怎么做。以下是我的代码的一些部分:

这将生成一个用户

 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)).

它创造了奇迹。你真的救了我,先生。非常感谢。