1:-module(models,[]). 2:- use_module(util(math)). 3:- use_module(util(misc)). 4:- use_module(pac(basic)). 5:- use_module(pac(meta)). 6
44
64
65start(F,Q,R):- split(F,F1), remove([],F1,F2),
66 maplist(herbrand,F2,Facts),
67 herbrand(Q,Query),
68 individuals(Facts,Inds),
69 (models(Inds,Facts,[],Query)-> R1=true; R1=false),
70 term_smash0(["<font color=\"red\">", R1, "</font>\n"], R).
71
72set_of_individuals(F,R):- split(F,F1), remove([],F1,F2),
73 maplist(herbrand,F2,Facts),
74 individuals(Facts,Inds),
75 insert(",", Inds, Inds0),
76 term_smash0(Inds0,R).
77
78individuals(F,S):- maplist(atoms,F,F1),
79 append(F1,F2),
80 sort(F2,S).
81
82atoms(X,[X]):-atomic(X),!.
83atoms(X,Y):- is_list(X),!,
84 maplist(atoms, X, Z),
85 append(Z, Y).
86atoms(X,Y):- X=..[_|A],
87 maplist(atoms, A, B),
88 append(B, Y).
89
93
97
100:- op(1100,xfx, <=>). 101
102def_macro(false, not(true)).
105def_macro(imply(X,Y), or(not(X), Y)).
106def_macro(iff(X,Y), and(imply(X,Y), imply(Y,X))).
107def_macro(all(X,P), not(some(X, not(P)))).
110models(_,_,_,true) :-!.
111models(X,Y,M,and(P,Q)) :-!, models(X,Y,M,P), models(X,Y,M,Q).
112models(X,Y,M,or(P,Q)) :-!, (models(X,Y,M,P); models(X,Y,M,Q)).
113models(X,Y,M,not(P)) :-!, \+ models(X,Y,M,P). 114models(I,F,M,some(X,P)):-!, member(A,I), models(I,F,[X=A|M],P).
115models(I,F,M,P):- def_macro(P,P1), !, models(I,F,M,P1).
116models(_,F,M,P):- substitute(P,M,Q), member(Q,F).
117
121
123substitute(X,M,Y):-atomic(X), member(X=Y,M), !.
124substitute(X,_,X):-atomic(X),!.
125substitute(X,M,Y):-
126 functor(X,F,N),
127 functor(Y,F,N),
128 substitute(N,X,M,Y).
129
130substitute(0,_,_,_):-!.
131substitute(J,X,M,Y):-
132 arg(J,X,A),
133 substitute(A,M,B),
134 arg(J,Y,B),
135 K is J-1,
136 substitute(K,X,M,Y).
137
139
140run :- prompt(A,''),
141 (sample(S), get0(_), format("~w.",[S]),
142 call(models:S, X), get0(_), nl,
143 format("~w~n~n",[X]), fail; prompt(_, A)).
144
145sample(semantics(pn, [john], [male(j),male(b),female(m),unicorn(u), find(m,u),walk(j),walk(b),walk(m)])).
146sample(semantics(np, [a, unicorn], [male(j),male(b),female(m),unicorn(u), find(m,u),walk(j),walk(b),walk(m)])).
147sample(semantics(s, [a, unicorn, walk], [male(j),male(b),female(m),unicorn(u), find(m,u),walk(j),walk(b),walk(m)])).
148sample(semantics(vp, [find, a, unicorn], [male(j),male(b),female(m),unicorn(u), find(m,u),walk(j),walk(b),walk(m)])).
149sample(semantics(s, [john,find, a, unicorn], [male(j),male(b),female(m),unicorn(u), find(m,u),walk(j),walk(b),walk(m)])).
150sample(semantics(pn, [john], [man(a),find(j,a),walk(j)])).
151sample(semantics(pn, [john], [man(a),find(j,a),walk(j)])).
152sample(semantics(tv, [find], [man(a),find(j,a),walk(j)])).
153sample(semantics(itv, [walk], [man(a),find(j,a),walk(j)])).
154sample(semantics(vp, [find, a, unicorn], [unicorn(a),find(j,a),walk(j)])).
155sample(semantics(s, [john, walk], [man(a),find(j,a),walk(j)])).
156sample(semantics(s, [every, man, walk], [man(a),find(j,a),walk(j)])).
157sample(semantics(s, [every, man, walk], [man(j),find(j,a),walk(j)])).
158
159s(member(VP,NP)) --> np(NP), vp(VP).
160
161np(apply(currify(A), CN)) --> determiner(A), cn(CN).
162np(PN) --> pn(PN).
163
164vp(ITV) --> itv(ITV).
165vp(inverse(currify(TV), NP)) --> tv(TV), np(NP).
166
167itv(ext(walk))-->[walk].
168
169tv(ext(find)) --> [find].
170tv(ext(kick)) --> [kick].
171
172pn(filter(j)) --> [john].
173pn(filter(b)) --> [bill].
174pn(filter(m)) --> [mary].
175
176cn(ext(unicorn)) --> [unicorn].
177cn(ext(man)) --> [man].
178cn(ext(woman)) --> [woman].
179
180determiner(q_sem(a)) --> [a].
181determiner(q_sem(every)) --> [every].
182
184
192
193semantics(S, Facts, V) :- semantics(s, S, Facts, V).
195semantics(C, S, F, V):- call(C, E, S, []),
196 individuals(F, Inds),
197 sem(Inds, F, E, V).
198semantics(_,_,_,'** Category mismatch ?').
200sem(_, Fac, ext(R), V) :- !, extension(Fac,R,V1), sort(V1,V).
201sem(D, _, filter(S), V) :- !, math:principal_filter(D, S, V).
202sem(D, _, q_sem(Q), V) :- !, q_sem(Q, D, V).
203sem(D, F, E, V) :- meta:mapterm_rec(models:sem(D,F), E, E1),
204 call(E1,V).
205
207extension([],_, []).
208extension([A|B],R, [A1|B1]):- A=..[R|L], !,
209 convert(L,A1),
210 extension(B,R,B1).
211extension([_|B],R, B1):- extension(B,R,B1).
212
213convert([], void):-!.
214convert([X], X):- !.
215convert([X|Y], (X,Y1)):- convert(Y,Y1).
216
219apply(F,A,V):- member(B-V,F), subset(A, B), subset(B, A).
220
222member(X,Y,true) :- member(X,Y),!.
223member(_,_,false).
224
226currify --> math:rel_to_fun.
227
229
230q_sem(a, D, R):- !,
231 ( powerset(D,PowD),
232 setof((X,Y), (member(X,PowD), member(Y,PowD), meet(X,Y)), R)
233 -> true
234 ; R=[]
235 ).
236q_sem(every, D, R):- !,
237 ( powerset(D,PowD),
238 setof((X,Y), (member(X,PowD), member(Y,PowD), subset(X,Y)), R)
239 -> true
240 ; R=[]
241 ).
242
243meet(X,Y):- member(A,X), member(A,Y).
244
245inverse(F, R, S):- inverse_image(F,R,S)