1/*
    2%  NomicMUD: A MUD server written in Prolog
    3%  Maintainer: Douglas Miles
    4%  Dec 13, 2035
    5%
    6%  Bits and pieces:
    7%
    8%    LogicMOO, Inform7, FROLOG, Guncho, PrologMUD and Marty's Prolog Adventure Prototype
    9% 
   10%  Copyright (C) 2004 Marty White under the GNU GPL 
   11%  Sept 20,1999 - Douglas Miles
   12%  July 10,1996 - John Eikenberry 
   13%
   14%  Logicmoo Project changes:
   15%
   16% Main file.
   17%
   18*/
   19
   20%:- ensure_loaded(adv_main).
   21
   22% Manipulate memories (M stands for Memories)
   23memorize(Figment, M0, M1) :- notrace(append([Figment], M0, M1)).
   24memorize_list(FigmentList, M0, M1) :- notrace((must_be(list,FigmentList),dmust(append(FigmentList, M0, M1)))).
   25forget(Figment, M0, M1) :- select(Figment, M0, M1).
   26forget_always(Figment, M0, M1) :- select_always(Figment, M0, M1).
   27%forget_default(Figment, Default, M0, M1) :-
   28%  select_default(Figment, Default, M0, M1).
   29thought(Figment, M) :- member(Figment, M).
   30
   31
   32% TODO: change agent storage into a term:
   33%   mind(AgentName, AgentType, History, ModelData, Goals /*, ToDo*/)
   34
   35% -------- Model updating predicates (here M stands for ModelData)
   36
   37% Fundamental predicate that actually modifies the list:
   38update_relation(Spatial, NewHow, Item, NewParent, Timestamp, M0, M2) :-
   39  select_always(h(Spatial, _How, Item, _Where, _T), M0, M1),
   40  append([h(Spatial, NewHow, Item, NewParent, Timestamp)], M1, M2).
   41
   42% Batch-update relations.
   43update_relations(_Spatial, _NewHow, [], _NewParent, _Timestamp, M, M).
   44update_relations(Spatial, NewHow, [Item|Tail], NewParent, Timestamp, M0, M2) :-
   45  update_relation(Spatial, NewHow, Item, NewParent, Timestamp, M0, M1),
   46  update_relations(Spatial, NewHow, Tail, NewParent, Timestamp, M1, M2).
   47
   48% If dynamic topology needs remembering, use
   49%      related(Spatial, exit(E), Here, [There1|ThereTail], Timestamp)
   50update_model_exit(Spatial, How, From, Timestamp, M0, M2) :-
   51  select(h(Spatial, How, From, To, _T), M0, M1),
   52  append([h(Spatial, How, From, To, Timestamp)], M1, M2).
   53update_model_exit(Spatial, How, From, Timestamp, M0, M1) :-
   54  append([h(Spatial, How, From, '<unexplored>', Timestamp)], M0, M1).
   55
   56update_model_exit(Spatial, How, From, To, Timestamp, M0, M2) :-
   57  select_always(h(Spatial, How, From, _To, _T), M0, M1),
   58  append([h(Spatial, How, From, To, Timestamp)], M1, M2).
   59
   60update_model_exits(_Spatial, [], _From, _T, M, M).
   61update_model_exits(Spatial, [Exit|Tail], From, Timestamp, M0, M2) :-
   62  update_model_exit(Spatial, Exit, From, Timestamp, M0, M1),
   63  update_model_exits(Spatial, Tail, From, Timestamp, M1, M2).
   64
   65%butlast(List, ListButLast) :-
   66%  %last(List, Item),
   67%  append(ListButLast, [_Item], List).
   68
   69% Match only the most recent Figment in Memory.
   70%last_thought(Figment, Memory) :-  % or member1(F, M), or memberchk(Term, List)
   71%  copy_term(Figment, FreshFigment),
   72%  append(RecentMemory, [Figment|_Tail], Memory),
   73%  \+ member(FreshFigment, RecentMemory).
   74
   75update_model(Spatial, Agent, carrying(Spatial, Objects), Timestamp, _Memory, M0, M1) :-
   76  update_relations(Spatial, held_by, Objects, Agent, Timestamp, M0, M1).
   77update_model(Spatial, _Agent, notice_children(Sense, Object, How, Children), Timestamp, _Mem, M0, M1) :-
   78  sensory_model(Sense, Spatial),
   79  update_relations(Spatial, How, Children, Object, Timestamp, M0, M1).
   80update_model(_Spatial, _Agent, sense_props(see, Object, PropList), Stamp, _Mem, M0, M2) :-
   81  select_always(props(Object, _, _), M0, M1),
   82  append([props(Object, PropList, Stamp)], M1, M2).
   83
   84update_model(Spatial, _Agent,
   85             sense(Sense, [you_are(Spatial, How, Here), exits_are(Exits), here_are(Objects)]),
   86             Timestamp, _Mem, M0, M4) :-
   87  sensory_model(Sense, Spatial),
   88  % Don't update map here, it's better done in the moved(Spatial, ) clause.
   89  update_relations(Spatial, How, Objects, Here, Timestamp, M0, M3), % Model objects seen Here
   90  findall(exit(E), member(E, Exits), ExitRelations),
   91  update_model_exits(Spatial, ExitRelations, Here, Timestamp, M3, M4).% Model exits from Here.
   92
   93
   94update_model(Spatial, Agent, moved(Spatial, Agent, There, How, Here), Timestamp, Mem, M0, M2) :-
   95  % According to model, where was I?
   96  in_model(h(Spatial, _, Agent, There, _T0), M0),
   97  % TODO: Handle goto(Spatial, on, table)
   98  % How did I get Here?
   99  append(RecentMem, [did(goto(Spatial, _HowGo, ExitName))|OlderMem], Mem), % find figment
  100  \+ member(did(goto(Spatial, _, _)), RecentMem),          % guarrantee recentness
  101  memberchk(timestamp(_T1), OlderMem),          % get associated stamp
  102  %player_format('~p moved: goto(Spatial, ~p, ~p) from ~p leads to ~p~n',
  103  %       [Agent, HowGo, Dest, There, Here]),
  104  update_model_exit(Spatial, exit(ExitName), There, Here, Timestamp, M0, M1), % Model the path.
  105  update_relation(Spatial, How, Agent, Here, Timestamp, M1, M2). % And update location.
  106
  107update_model(Spatial, _Agent, moved(Spatial, Object, _From, How, To), Timestamp, _Mem, M0, M1) :-
  108  update_relation(Spatial, How, Object, To, Timestamp, M0, M1).
  109
  110update_model(_Spatial, _Agent, failure(_), _Timestamp, _Mem, M0, M0) :- !.
  111
  112update_model(Spatial, Agent, time_passes, Timestamp, _Memory, M, M):-
  113  nop(dbug(unused_update_model(Spatial, Agent, time_passes, Timestamp, M))).
  114
  115update_model(_Spatial, _Agent, [], _Timestamp, _Memory, M, M).
  116update_model(Spatial, Agent, [Percept|Tail], Timestamp, Memory, M0, M2) :-
  117  update_model(Spatial, Agent, Percept, Timestamp, Memory, M0, M1),
  118  update_model_all(Spatial, Agent, Tail, Timestamp, Memory, M1, M2).
  119
  120
  121update_model(Spatial, Agent, Percept, Timestamp, _Memory, M, M):-
  122  dbug(failed_update_model(Spatial, Agent, Percept, Timestamp)).
  123
  124% update_model_all(Spatial, Agent, PerceptsList, Stamp, ROMemory, OldModel, NewModel)
  125update_model_all(_Spatial, _Agent, [], _Timestamp, _Memory, M, M).
  126update_model_all(Spatial, Agent, [Percept|Tail], Timestamp, Memory, M0, M2) :-
  127  update_model(Spatial, Agent, Percept, Timestamp, Memory, M0, M1),
  128  update_model_all(Spatial, Agent, Tail, Timestamp, Memory, M1, M2)