Startpunkten
This commit is contained in:
219
Prenex_Normal_Form/lab3.pl
Normal file
219
Prenex_Normal_Form/lab3.pl
Normal file
@@ -0,0 +1,219 @@
|
||||
/*****************************/
|
||||
/* Christian Ohlsson */
|
||||
/* Logik för dataloger */
|
||||
/* Karlstad 990228 */
|
||||
/* Laboration 3 i Logik */
|
||||
/*****************************/
|
||||
/* Functions included */
|
||||
/* prenex */
|
||||
/* implout */
|
||||
/* negin */
|
||||
/* kvant */
|
||||
/* free_in */
|
||||
/* rename_var */
|
||||
/*****************************/
|
||||
|
||||
:- op(200,fx,~).
|
||||
:- op(400,xfy,#).
|
||||
:- op(400,xfy,&).
|
||||
:- op(700,xfy,->).
|
||||
:- op(700,xfy,<->).
|
||||
|
||||
prenex(Formel,PNF):-
|
||||
implout(Formel,Svar1),
|
||||
negin(Svar1,Svar2),
|
||||
kvant(Svar2,PNF,[x1,x2,x3,x4,x5,x6,x7,x8,x9,x10],L).
|
||||
|
||||
/* ***************************** IMPLOUT **************************** */
|
||||
|
||||
implout((P<->Q),((P1&Q1)#(~P1&~Q1))) :- !,implout(P,P1),implout(Q,Q1).
|
||||
implout((P->Q),(~P1#Q1)) :- !,implout(P,P1),implout(Q,Q1).
|
||||
implout(all(X,P),all(X,P1)) :- !,implout(P,P1).
|
||||
implout(exist(X,P),exist(X,P1)) :- !,implout(P,P1).
|
||||
implout((P&Q),(P1&Q1)) :- !,implout(P,P1),implout(Q,Q1).
|
||||
implout((P#Q),(P1#Q1)) :- !,implout(P,P1),implout(Q,Q1).
|
||||
implout((~P),(~P1)) :- !,implout(P,P1).
|
||||
implout(P,P).
|
||||
|
||||
/* ***************************** NEGIN **************************** */
|
||||
|
||||
negin((~P),P1) :- !,neg(P,P1).
|
||||
negin(all(X,P),all(X,P1)) :- !,negin(P,P1).
|
||||
negin(exist(X,P),exist(X,P1)) :- !,negin(P,P1).
|
||||
negin((P&Q),(P1&Q1)) :- !,negin(P,P1),negin(Q,Q1).
|
||||
negin((P#Q),(P1#Q1)) :- !,negin(P,P1),negin(Q,Q1).
|
||||
negin(P,P).
|
||||
neg((~P),P1) :- !,negin(P,P1).
|
||||
neg(all(X,P),exist(X,P1)) :- !,neg(P,P1).
|
||||
neg(exist(X,P),all(X,P1)) :- !,neg(P,P1).
|
||||
neg((P&Q),(P1#Q1)) :- !,neg(P,P1),neg(Q,Q1).
|
||||
neg((P#Q),(P1&Q1)) :- !,neg(P,P1),neg(Q,Q1).
|
||||
neg(P,(~P)).
|
||||
|
||||
/* ***************************** RENAME-VAR **************************** */
|
||||
|
||||
r_v(X,exist(X,P),exist(F,P1),[F|R]):- r_v(X,P,P1,[F|R]).
|
||||
r_v(X,exist(Y,P),exist(Y,P1),[F|R]):- X\==Y, r_v(X,P,P1,[F|R]).
|
||||
|
||||
r_v(X,all(X,P),all(F,P1),[F|R]):- r_v(X,P,P1,[F|R]).
|
||||
r_v(X,all(Y,P),all(Y,P1),[F|R]):- X\==Y, r_v(X,P,P1,[F|R]).
|
||||
|
||||
r_v(X,Y#Z,Y1#Z1,[F|R]):- r_v(X,Y,Y1,[F|R]),r_v(X,Z,Z1,[F|R]).
|
||||
r_v(X,Y&Z,Y1&Z1,[F|R]):- r_v(X,Y,Y1,[F|R]),r_v(X,Z,Z1,[F|R]).
|
||||
r_v(X,Y->Z,Y1->Z1,[F|R]):- r_v(X,Y,Y1,[F|R]),r_v(X,Z,Z1,[F|R]).
|
||||
r_v(X,Y<->Z,Y1<->Z1,[F|R]):- r_v(X,Y,Y1,[F|R]),r_v(X,Z,Z1,[F|R]).
|
||||
|
||||
r_v(X,Y,Y2,[F|R]):- Y=..[T,S],r_v(X,S,Y1,[F|R]), Y2=..[T,Y1].
|
||||
r_v(X,[T|S],[F|S1],[F|R]):- X==T, r_v(X,S,S1,[F|R]).
|
||||
r_v(X,[T|S],[S2|S1],[F|R]):- X\==T, r_v(X,S,S1,[F|R]),r_v(X,T,S2,[F|R]).
|
||||
r_v(X,~P,~P1,[F|R]):- r_v(X,P,P1,[F|R]).
|
||||
r_v(X,X,F,[F|R]).
|
||||
r_v(X,U,U,[F|R]):- X\==U.
|
||||
|
||||
/* ***************************** FREE ****************************** */
|
||||
|
||||
free_in(X,exist(Y,P)):- X\==Y, free_in(X,P).
|
||||
free_in(X,all(Y,P)):- X\==Y, free_in(X,P).
|
||||
free_in(X,Y#Z):-free_in(X,Y);free_in(X,Z).
|
||||
free_in(X,Y&Z):-free_in(X,Y);free_in(X,Z).
|
||||
free_in(X,Y->Z):-free_in(X,Y);free_in(X,Z).
|
||||
free_in(X,Y<->Z):-free_in(X,Y);free_in(X,Z).
|
||||
|
||||
free_in(X,Y):- Y=..[F,R],free_in(X,R).
|
||||
free_in(X,[F|R]):-free_in(X,F);free_in(X,R).
|
||||
|
||||
free_in(X,~Z):-free_in(X,Z).
|
||||
free_in(X,X).
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
/* ***************************** ALL & ***************************** */
|
||||
|
||||
kvant(all(X,Y)&Z,SY,[F|R],L3):-
|
||||
(free_in(X,Z),
|
||||
r_v(X,Z,Z1,[F]),
|
||||
kvant(Y,Y1,R,R1),
|
||||
kvant(Z1,Z2,R1,L2),
|
||||
kvant(all(X,(Y1&Z2)),SY,L2,L3));
|
||||
(kvant(Y,Y1,R,R1),
|
||||
kvant(Z,Z2,R1,L2),
|
||||
kvant(all(X,(Y1&Z2)),SY,L2,L3)).
|
||||
|
||||
/* ***************************** & ALL **************************** */
|
||||
|
||||
kvant(Z&all(X,Y),SY,[F|R],L3):-
|
||||
(free_in(X,Z),
|
||||
r_v(X,Z,Z1,[F]),
|
||||
kvant(Y,Y1,R,R1),
|
||||
kvant(Z1,Z2,R1,L2),
|
||||
kvant(all(X,(Z2&Y1)),SY,L2,L3));
|
||||
(kvant(Y,Y1,R,R1),
|
||||
kvant(Z,Z2,R1,L2),
|
||||
kvant(all(X,(Z2&Y1)),SY,L2,L3)).
|
||||
|
||||
|
||||
/* ***************************** ALL # **************************** */
|
||||
|
||||
kvant(all(X,Y)#Z,SY,[F|R],L3):-
|
||||
(free_in(X,Z),
|
||||
r_v(X,Z,Z1,[F]),
|
||||
kvant(Y,Y1,R,R1),
|
||||
kvant(Z1,Z2,R1,L2),
|
||||
kvant(all(X,(Y1#Z2)),SY,L2,L3));
|
||||
(kvant(Y,Y1,R,R1),
|
||||
kvant(Z,Z2,R1,L2),
|
||||
kvant(all(X,(Y1#Z2)),SY,L2,L3)).
|
||||
|
||||
|
||||
/* ***************************** # ALL **************************** */
|
||||
|
||||
kvant(Z#all(X,Y),SY,[F|R],L3):-
|
||||
(free_in(X,Z),
|
||||
r_v(X,Z,Z1,[F]),
|
||||
kvant(Y,Y1,R,R1),
|
||||
kvant(Z1,Z2,R1,L2),
|
||||
kvant(all(X,(Z2#Y1)),SY,L2,L3));
|
||||
(kvant(Y,Y1,R,R1),
|
||||
kvant(Z,Z2,R1,L2),
|
||||
kvant(all(X,(Z2#Y1)),SY,L2,L3)).
|
||||
|
||||
|
||||
/* *************************** EXIST & ************************** */
|
||||
|
||||
kvant(exist(X,Y)&Z,SY,[F|R],L3):-
|
||||
(free_in(X,Z),
|
||||
r_v(X,Z,Z1,[F]),
|
||||
kvant(Y,Y1,R,R1),
|
||||
kvant(Z1,Z2,R1,L2),
|
||||
kvant(exist(X,(Y1&Z2)),SY,L2,L3));
|
||||
(kvant(Y,Y1,R,R1),
|
||||
kvant(Z,Z2,R1,L2),
|
||||
kvant(exist(X,(Y1&Z2)),SY,L2,L3)).
|
||||
|
||||
/* *************************** & EXIST ************************** */
|
||||
|
||||
kvant(Z&exist(X,Y),SY,[F|R],L3):-
|
||||
(free_in(X,Z),
|
||||
r_v(X,Z,Z1,[F]),
|
||||
kvant(Y,Y1,R,R1),
|
||||
kvant(Z1,Z2,R1,L2),
|
||||
kvant(exist(X,(Z2&Y1)),SY,L2,L3));
|
||||
(kvant(Y,Y1,R,R1),
|
||||
kvant(Z,Z2,R1,L2),
|
||||
kvant(exist(X,(Z2&Y1)),SY,L2,L3)).
|
||||
|
||||
/* *************************** EXIST # ************************** */
|
||||
|
||||
kvant(exist(X,Y)#Z,SY,[F|R],L3):-
|
||||
(free_in(X,Z),
|
||||
r_v(X,Z,Z1,[F]),
|
||||
kvant(Y,Y1,R,R1),
|
||||
kvant(Z1,Z2,R1,L2),
|
||||
kvant(exist(X,(Y1#Z2)),SY,L2,L3));
|
||||
(kvant(Y,Y1,R,R1),
|
||||
kvant(Z,Z2,R1,L2),
|
||||
kvant(exist(X,(Y1#Z2)),SY,L2,L3)).
|
||||
|
||||
/* *************************** # EXIST ************************** */
|
||||
|
||||
kvant(Z#exist(X,Y),SY,[F|R],L3):-
|
||||
(free_in(X,Z),
|
||||
r_v(X,Z,Z1,[F]),
|
||||
kvant(Y,Y1,R,R1),
|
||||
kvant(Z1,Z2,R1,L2),
|
||||
kvant(exist(X,(Z2#Y1)),SY,L2,L3));
|
||||
(kvant(Y,Y1,R,R1),
|
||||
kvant(Z,Z2,R1,L2),
|
||||
kvant(exist(X,(Z2#Y1)),SY,L2,L3)).
|
||||
|
||||
|
||||
|
||||
/* *************************** & ************************** */
|
||||
|
||||
kvant(P&Q,PQ,L,L3):-
|
||||
kvant(P,P1,L,L1),
|
||||
kvant(Q,Q1,L1,L2),
|
||||
((P1\==P);(Q1\==Q)),
|
||||
kvant(P1&Q1,PQ,L2,L3).
|
||||
|
||||
/* *************************** # ************************** */
|
||||
|
||||
kvant(P#Q,PQ,L,L3):-
|
||||
kvant(P,P1,L,L1),
|
||||
kvant(Q,Q1,L1,L2),
|
||||
((P1\==P);(Q1\==Q)),
|
||||
kvant(P1#Q1,PQ,L2,L3).
|
||||
|
||||
/* *************************** EXIST ************************** */
|
||||
|
||||
kvant(all(X,F),all(X,F1),L1,L2):-
|
||||
kvant(F,F1,L1,L2).
|
||||
|
||||
/* *************************** ALL ************************** */
|
||||
|
||||
kvant(exist(X,F),exist(X,F1),L1,L2):-
|
||||
kvant(F,F1,L1,L2).
|
||||
|
||||
/* *************************** BASFALL ************************** */
|
||||
|
||||
kvant(X,X,L,L).
|
||||
Reference in New Issue
Block a user