:- 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,s(L,X,[]),M), press(M), parse. process(_) :- printstring("Ugyldig setning"), nl, parse. press([L|X]) :- printstring("Logisk form:"), nl, write(L), nl, eval(L), 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 s(Formel) --> np(Subjekt,Predikat,Formel), vp(Subjekt,Predikat). np(X,Predikat,Formel) --> d(X,Substantiv,Predikat,Formel,Genus), n(X,Substantiv,Genus). vp(S,PRED) --> v2(S,DO,V), np(DO,V,PRED). vp(S,PRED) --> v1(S,PRED). 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])],m) --> [hver]. d(X,Substantiv,Predikat,[every(X,[Substantiv ->Predikat])],n) --> [hvert]. 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]. 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). sant([every(_,[P->Q])]) :- not((sant(P),not(sant(Q)))). 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)]).