1:- module(langsem,[]).    2:- use_module(util(math)).    3:- use_module(pac(op)).    4:- use_module(pac(basic)).    5
    6%;; (setq module-query  "qcompile(util(langsem)), module(langsem).")
    7% ?- qcompile(util(langsem)), module(langsem).
    8
    9val(X, Y):- pac:eval(X, Y).
   10
   11% ?- montague_basic(j, X).
   12% ?- montague_basic(powerset([a,b,c]), X).
   13% ?- montague_basic(filter([a,b,c], [c]), X).
   14% ?- montague_basic(currify([(a,b)]), X).
   15% ?- montague_basic(a, A), length(A, L).
   16% ?- montague_basic(inverse([(1, b), (3, a), (2, b)], [b]), A).
   17% ?- montague_basic(value(a, [(a,b)]), A).
   18% ?- montague_basic(value(a, [(a,b), (a,c)]), A).
   19% ?- montague_basic(member(2, [1,2]), R).
   20%
   21individuals([j,m,u]).
   22%
   23montague_basic(Ind, Ind):-individuals(D), memq(Ind, D), !.
   24montague_basic(unicorn, [u]):-!.
   25montague_basic(find, [(j, u)]):-!.
   26montague_basic(powerset(X), P) :- !, math:powerset(X, P).
   27montague_basic(filter(A, B), F):- !, math:filter(B, A, F).
   28montague_basic(currify(A), C):- !, currify(A, C).
   29montague_basic(a, A):-!, individuals(D), a(D, A).
   30montague_basic(value(R, X), V):- !, value(R, X, V).
   31montague_basic(inverse(F, Y), X):- !, inverse(F, Y, X).
   32montague_basic(member(X, Y), R):- !, member(X, Y, R).
   33
   34% ?- trace, run_cgi(`(peek([@phrase2, @words2,@frame2]), maplist(herbrand), apply(models:semantics))`, [words2 = `[a, man]`, phrase2 =`np`, frame2 =`[man(j),man(b),woman(m),unicorn(u), kick(u,j), find(m,u), walk(j),walk(b),walk(m)]`]).
   35% ?- test.
   36
   37test :- repeat,
   38	(sample(X), writeln(X), write('=> '),
   39	 (montague(X, Y)-> writeln(Y); writeln( '** fail **')),
   40	 fail
   41	; true ), !.
   42
   43% ?- qcompile(util(langsem)), module(langsem).
   44% ?- montague(value(currify(a([j,u])), unicorn), R).
   45% ?- montague(value @ currify(a([j,u])) @ unicorn, R).
   46% ?- montague(value(currify(a([j,u])), [j]), R).
   47
   48sample(filter([j], [j,u])).
   49sample(currify([(a,b)])).
   50sample(a([j,u])).
   51sample(unicorn).
   52sample(find).
   53sample(currify(a([j,u]))).
   54sample(value(currify(a([j,u])), unicorn)).
   55sample(currify(find)).
   56sample(value(currify(a([j,u])), unicorn)).
   57sample(value @ currify(a([j,u])) @ unicorn).
   58sample(inverse(currify(find), (value @ currify(a([j,u])) @ unicorn))).
   59sample(member(inverse(currify(find), (value @currify(a([j,u])) @ unicorn)), filter([j], [j, u]))).
   60sample(member(inverse(currify(find), value(currify(a([j,u])), unicorn)), filter([j], [j, u]))).
   61
   62% ?- test.
   63
   64test(Query, YesNo):- D = [j,u],
   65	J = filter([j],D),
   66	A = a(D),
   67	AC = currify(A),
   68	U = unicorn,
   69	AUnicorn = (@(AC,U)),
   70	Love = love,
   71	LoveC = currify(Love),
   72	Inv = inverse(LoveC,AUnicorn),
   73	Query = member(Inv,J),
   74	val(Query, YesNo).
   75
   76%
   77member(X, Y, true):-member(X,Y),!.
   78member(_, _, false).
   79
   80% ?- qcompile(util(langsem)), module(langsem).
   81% ?- langsem:field([(a,b),(b,c)], X).
   82% ?- langsem:currify([(a,b), (b,c)], X).
   83
   84field(R, F):- setof(A, B^(member((A,B), R); member((B, A), R)), F), !.
   85field(_, []).
   86
   87% ?- langsem:value([(a,b)], a, X).
   88% X = b
   89
   90value(F, A, V):- memberchk((A,V), F).
   91%
   92values(X, R, Vs):- setof(V, member((X, V), R), Vs), !.
   93values(_, _, []).
   94%
   95currify(R, C):-	field(R, S),
   96	(   setof((X, Ys), (member(X, S), values(X, R, Ys)), C)
   97	->	true
   98	;	C = []
   99	).
  100%
  101compose(X, Y, V):-  join(X, Y, V).
  102%
  103join(X, Y, V):-
  104	(	setof((A, B), C^(member((A,C),X), member((C,B),Y)), V)
  105	->	true
  106	;	V = []
  107	).
  108
  109% ?- inverse([(1, a),(2, b), (3, a)], [a], X).
  110% X = [1, 3].
  111
  112inverse(F, R, S):-
  113	(	setof(X, Y^(member(Y, R),member((X, Y), F)), S)
  114	->	true
  115	;	S = []
  116	).
  117
  118%
  119meet(X,Y):- member(A,X), member(A,Y).
  120%
  121have(X, Y, true):- member(Y, X), !.
  122have(_, _, false).
  123
  124%
  125a(D, R):-( powerset(D, PowD),
  126	   setof((X,Y),
  127		(member(X,PowD),member(Y,PowD), meet(X,Y)),
  128		 R)
  129	-> true
  130	;  R=[]
  131	).
  132%
  133love([(j,u)]).
  134%
  135find([(j,u)]).
  136%
  137unicorn([u]).
  138
  139% ?- montague(1, X).
  140% ?- montague(j, X).
  141% ?- montague(k, X).	% error.
  142% ?- montague(a, X).   % default for a
  143% ?- montague(a([1,2]), X).
  144% ?- montague(a@[1,2], X).
  145% ?- montague([1,2], X).
  146% ?- montague(A, X).
  147% ?- montague(powerset@powerset([1]), X), length(X, L).
  148% ?- montague(powerset@powerset([1,2,3,4]), X), length(X, L).
  149
  150montague(X, X):-  (var(X); integer(X); is_list(X)), !.
  151montague(X, Y):- elim_atmark(X, X0),
  152	montague_args(X0, U),
  153	(	montague_basic(U, Y) -> true
  154	;	call(U, Y)
  155	).
  156%
  157montague_args([F|As], V):-
  158	montague_args(F, F0),
  159	maplist(montague, As, Bs),
  160	reduce:complete_args(F0, Bs, V).
  161
  162%
  163montague_args(F, G):- nonvar(F),
  164	F=..[H|As],
  165	maplist(montague, As, Bs),
  166	G=..[H|Bs].
  167
  168% ?- elim_atmark(a@(b@c), X).
  169% ?- elim_atmark(a@b@c, X).
  170elim_atmark(X, [X]):- var(X), !.
  171elim_atmark(X@Y, Z):- !, elim_atmark(X, U),
  172	append(U, [Y], Z).
  173elim_atmark(X, [X])