:- op(500,xfy,&). :- op(600,xfy,->). % HOVEDSL¯YFE parse :- nl, read_s(X), process(X). process(X) :- X=[cut], nl, abort. process(X) :- nl, setof([L,P],s([L,P],X,[]),M), press(M), parse. process(_) :- printstring("Ugyldig setning"), nl, parse. press([[L,P]|X]) :- printstring("Logisk form:"), nl, write(L), nl, eval(L),nl, nl,printstring("Logisk form:"), nl, write(P), nl, eval(P),nl, nl, press(X). press([]). % INPUTMODUL read_s(Words) :- get0(Char), read_s(Char,Words). read_s(`\n`,[]) :- !. read_s(` `,Words) :- !, get0(Char), read_s(Char,Words). read_s(C,[W|Ws]) :- read_w(C,Cs,Next), name(W,Cs), read_s(Next,Ws). read_w(` `,[],` `) :- !. read_w(`\n`,[],`\n`) :- !. read_w(Char,[Char|Chars],Last) :- get0(Next), read_w(Next,Chars,Last). % SEMANTISK PARSER sX([Formel,Formel2]) --> np(Subjekt,Predikat,Formel), vpX(Subjekt,Predikat,Predikat,Predikat), {skift(Formel,Formel2)}. s([Formel,Formel2]) --> sX([Formel,Formel2]). s([Formel1&Formel2,Formel3&Formel4]) --> sX([Formel1,Formel3]),[og],s([Formel2,Formel4]). skift([exist(X,[P&[every(Y,[Q->R])]])],[every(Y,[Q->[exist(X,[P&R])]])]):-!. skift([every(Y,[Q->[exist(X,[P&R])]])],[exist(X,[P&[every(Y,[Q->R])]])]):-!. skift(X,X). np(X,Predikat,Formel) --> d(X,Substantiv,Predikat,Formel,Genus), n(X,Substantiv,Genus). npX(Subj,_,_)-->ubestemmer(G),n(Log,[Log],G),{Log=..[Subj|_]}. kopula_str(Subj,P,Str):-Str=..[P,Subj]. ubestemmer(m) --> [en]. ubestemmer(n) --> [et]. ubestemmer(0) --> []. vpX(Subj,VP,P1,P2)-->vp(Subj,VP,P1,P2). vpX(Subj,VP1&VP2,X,X)-->vp(Subj,VP1,$,$),[og],vpX(Subj,VP2,$,$). vp(S,PRED,PRED,PRED) --> v2(S,DO,V), np(DO,V,PRED). vp(S,PRED,Formel,Formel1) --> v2(S,DO,PRED), np(DO,Formel1,Formel). vp(S,PRED,PRED,PRED) --> v1(S,PRED). vp(Subj,[Str],X,X)-->[er],npX(P,_,_),{kopula_str(Subj,P,Str)}. d(_,_,Predikat,Predikat,0) --> []. d(X,Substantiv,Predikat,[exist(X,[Substantiv & Predikat])],m) --> [en]. d(X,Substantiv,Predikat,[exist(X,[Substantiv & Predikat])],n) --> [et]. d(X,Substantiv,Predikat,[every(X,[Substantiv ->Predikat])],p) --> [alle]. d(X,Substantiv,Predikat,[every(X,[-(Substantiv&Predikat)])],p) --> [ingen]. d(X,Substantiv,Predikat,[every(X,[Predikat -> Substantiv ])],p) --> [bare]. n(blot,_,0) --> [blot]. n(ming,_,0) --> [ming]. n(bond,_,0) --> [bond]. n('007',_,0) --> [007]. n(blaise,_,0) --> [blaise]. n(X,[agent(X)],m) --> [agent]. n(X,[fantom(X)],n) --> [fantom]. n(X,[agent(X)],p) --> [agenter]. n(X,[fantom(X)],p) --> [fantomer]. v1(S,[agerer(S)]) --> [agerer]. v2(S,DO,[jager(S,DO)]) --> [jager]. % SEMANTIKK eval(T):- printstring("Sannhetsverdi: "), sant(T), printstring("1"); printstring("0"). sant([T]) :- T=..[PRED|ARG], ref(PRED,Z), liste_term(ARG,A), member(A,Z). sant([exist(_,[P&Q])]) :- sant(P), sant(Q). %EN/ET sant([every(_,[-(P&Q)])]) :- not((sant(P),sant(Q))). %INGEN sant([every(_,[P->Q])]) :- not((sant(P),not(sant(Q)))). %ALLE/BARE sant(R&S):-sant(R),sant(S). liste_term([X],X). liste_term([X,Y],(X,Y)). ref(fantom,[blot,ming]). ref(agent,[blaise,bond,'007']). ref(agerer,[bond,ming]). ref(jager,[(bond,ming),('007',ming),(blaise,blot)]).