17
18:- if(exists_source(library(nldata/clex_iface))). 20:- user:ensure_loaded(library(nldata/clex_iface)). 21:- endif. 26
27
28cmdalias(d, down).
29cmdalias(e, east).
30cmdalias(i, inventory).
31cmdalias(l, look).
32cmdalias(n, north).
33cmdalias(s, south).
34cmdalias(u, up).
35cmdalias(w, west).
36cmdalias(x, examine).
37cmdalias(z, wait).
38
39preposition(spatial, P) :-
40 member(P, [at, down, in, inside, into, of, off, on, onto, out, over, to, under, up, with]).
41
42preposition(_Other, P) :-
43 member(P, [of, beside]).
44
45compass_direction(D) :-
46 member(D, [north, south, east, west]).
47
48reflexive(W) :- member(W, [self, me, myself , i]). 49
50strip_noise_words([to|Tokens], NewTokens) :- strip_noise_words(Tokens, NewTokens).
51strip_noise_words(Tokens, NewTokens) :-
52 findall(Token,
53 ( member(Token, Tokens),
54 \+ member(Token, ['please', 'the', 'a', 'an', 'some', 'thee'])),
55 NewTokens).
56
57convert_reflexive(Agent, Words, NewWords) :-
58 59 findall(Token,
60 ( member(Word, Words),
61 ( reflexive(Word), Token = Agent;
62 Token = Word )),
63 NewWords).
64
65
67parse(Tokens, Action, Memory) :-
68 (Tokens = [_] -> Tokens2 = Tokens ; strip_noise_words(Tokens, Tokens2)),
69 parse2logical(Tokens2, Action, Memory).
70
71:- discontiguous(parse2logical/3). 72
73object_or_self([], Agent, Mem):- thought(inst(Agent), Mem), !.
74object_or_self(List,Agent,Mem):- append(LList,[R],List),member(R,[(?),(.)]),!,object_or_self(LList,Agent,Mem).
75object_or_self([am, i], Agent, Mem):- thought(inst(Agent), Mem), !.
76object_or_self([is| List], Agent, Mem):-!,object_or_self(List,Agent,Mem).
77object_or_self([Agent], Agent, _Mem).
78
79parse2logical([who|Tail], whois(_Whoial, Agent), Mem) :- object_or_self(Tail, Agent, Mem).
80parse2logical([whom|Tail], whois(_Whoial, Agent), Mem) :- object_or_self(Tail, Agent, Mem).
81parse2logical([what|Tail], whatis(_What_Spatial, Agent), Mem) :- object_or_self(Tail, Agent, Mem).
82parse2logical([where|Tail], whereis(spatial, Agent), Mem) :- object_or_self(Tail, Agent, Mem).
83parse2logical([model|Tail], model(_All_Spatial, Agent), Mem) :- object_or_self(Tail, Agent, Mem).
84parse2logical([memory|Tail], memory(Agent), Mem) :- object_or_self(Tail, Agent, Mem).
85
86parse2logical([ask, Object | Msg], emote(Spatial, say, Object, Msg), _M):- current_spatial(Spatial).
87parse2logical([request, Object | Msg], emote(Spatial, say, Object, Msg), _M):- current_spatial(Spatial).
88parse2logical([tell, Object | Msg], emote(Spatial, say, Object, Msg), _M):- current_spatial(Spatial).
89parse2logical([talk, Object | Msg], emote(Spatial, say, Object, Msg), _M):- current_spatial(Spatial).
90parse2logical([say|Msg], emote(Spatial, say, *, Msg), _M):- current_spatial(Spatial).
91parse2logical([emote|Msg], emote(Spatial, act, *, Msg), _M):- current_spatial(Spatial).
92parse2logical([Object, ',' | Msg], emote(Spatial, say, Object, Msg), Mem) :- current_spatial(Spatial),
93 thought_model(Spatial,ModelData, Mem),
94 in_model(h(Spatial, _, Object, _, _), ModelData).
95parse2logical(Words, Action, Mem) :- Words \== [i], 96 97 append(Before, [Self|After], Words),
98 reflexive(Self),
99 thought(inst(Agent), Mem),
100 append(Before, [Agent|After], NewWords),
101 parse2logical(NewWords, Action, Mem).
102
103
104parse2logical([dig, Hole], dig(Spatial, Hole, Where, Tool), Mem) :-
105 thought_model(Spatial,ModelData, Mem),
106 thought(inst(Agent), Mem),
107 in_model(h(Spatial, _, Agent, Where, _), ModelData),
108 Tool=shovel.
109parse2logical([get, Prep], goto(Spatial, (*), Prep), _Mem) :-
110 preposition(Spatial, Prep).
111parse2logical([get, Prep, Object], goto(Spatial, Prep, Object), _Mem) :-
112 preposition(Spatial, Prep).
113
114parse2logical([get, Object], take(Spatial, Object), _Mem) :- equals_efffectly(model, Spatial, take).
115
116parse2logical([give, Object, to, Recipient], give(Spatial, Object, Recipient), _Mem):- equals_efffectly(model, Spatial, give).
117
118parse2logical([go, escape], goto(Spatial, (*), escape), _Mem):- equals_efffectly(model, Spatial, escape).
119parse2logical([go, Dir], goto(Spatial, (*), Dir), _Mem) :-
120 compass_direction(Dir), equals_efffectly(model, Spatial, spatial).
121parse2logical([go, Prep], goto(Spatial, (*), Prep), _Mem) :-
122 preposition(Spatial, Prep).
123parse2logical([go, ExitName], goto(Spatial, (*), ExitName), Mem) :-
124 thought_model(Spatial,ModelData, Mem),
125 in_model(h(Spatial, exit(ExitName), _, _, _), ModelData).
126parse2logical([go, Dest], goto(Spatial, (*), Dest), Mem) :-
127 thought_model(Spatial,ModelData, Mem),
128 in_model(h(Spatial, _, _, Dest, _), ModelData).
129 130
131parse2logical([light, Thing], Result, Mem):- !, parse2logical([switch, on, Thing], Result, Mem).
132parse2logical([turn, Thing, OnOff], Result, Mem) :- preposition(_, OnOff), !, parse2logical([switch, OnOff, Thing], Result, Mem).
133parse2logical([turn, OnOff, Thing], Result, Mem) :- preposition(_, OnOff), !, parse2logical([switch, OnOff, Thing], Result, Mem).
134parse2logical([switch, Thing, OnOff], Result, Mem) :- preposition(_, OnOff), !, parse2logical([switch, OnOff, Thing], Result, Mem).
135parse2logical([switch, OnOff, Thing], switch(Spatial, OnOff, Thing), _Mem) :-
136 preposition(_, OnOff), current_spatial(Spatial).
137
138
140
141
142parse2logical([CmdAlias|Tail], Action, Mem) :-
143 cmdalias(CmdAlias, Verb),
144 parse2logical([Verb|Tail], Action, Mem).
145
146parse2logical([Prep], goto(Spatial, (*), Prep), _Mem) :- preposition(Spatial, Prep).
147parse2logical([Dir], Logic, Mem):- (compass_direction(Dir);Dir==escape), !, parse2logical([go, Dir], Logic, Mem).
148
149parse2logical([ExitName], goto(Spatial, (*), ExitName), Mem) :-
150 thought_model(Spatial,ModelData, Mem),
151 in_model(h(Spatial, exit(ExitName), _, _, _), ModelData).
152
153parse2logical([Verb|Args], Action, _M) :- Args\==[], Args\==['.'], action_model(Verb, Spatial),
154 155 Action =.. [Verb, Spatial|Args].
156
157parse2logical([Verb|Args], Action, _M) :-
158 159 Action =.. [Verb|Args]