263 lines
5.6 KiB
Plaintext
263 lines
5.6 KiB
Plaintext
:- module(wfs,[main/0, main/1]).
|
|
|
|
:- use_module(library(chr)).
|
|
:- use_module(library(lists)).
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
%
|
|
% Schrijf het programma waarvan je de wellfounded semantics wil bepalen
|
|
% hieronder onder de vorm van prog/1 feiten. Let erop dat je een conjunctie
|
|
% in de body tussen haakjes zet zodat prog/1 geparsed wordt, ipv prog/n.
|
|
|
|
/*
|
|
|
|
prog(p :- p).
|
|
|
|
prog(p :- \+ p).
|
|
|
|
|
|
prog(p :- (q, \+ r)).
|
|
prog(q :- (r, \+ p)).
|
|
prog(r :- (p, \+ q)).
|
|
|
|
prog(p :- r).
|
|
prog(r :- q).
|
|
prog(q :- \+ q).
|
|
|
|
prog(p :- r).
|
|
prog(r).
|
|
|
|
prog(p :- p).
|
|
prog(s :- \+ p).
|
|
prog(y :- (s, \+ x)).
|
|
prog(x :- y).
|
|
*/
|
|
prog(a :- a).
|
|
prog(b :- b).
|
|
prog(b :- \+ a).
|
|
prog(c :- \+ b).
|
|
prog(c :- c).
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
|
|
:- chr_constraint true/1, false/1, undefined/1, aclause/2, pos/2, neg/2, nbulit/2, nbplit/2, nbucl/2, phase2/0, true2/1, undefined2/1, aclause2/2, pos2/2, nbplit2/2, phase1/0, witness1/0, witness2/0.
|
|
|
|
true(At), aclause(Cl,At) \ pos(_,Cl) <=> true.
|
|
|
|
true(At), aclause(Cl,At) \ neg(_,Cl) <=> true.
|
|
|
|
false(At), aclause(Cl,At) \ pos(_,Cl) <=> true.
|
|
|
|
false(At), aclause(Cl,At) \ neg(_,Cl) <=> true.
|
|
|
|
true(At) \ nbucl(At,_) <=> true.
|
|
|
|
true(At) \ aclause(Cl,At), nbulit(Cl,_), nbplit(Cl,_) <=> true.
|
|
|
|
false(At) \ nbucl(At,_) <=> true.
|
|
|
|
nbucl(At,0) <=> false(At).
|
|
|
|
aclause(Cl,At), nbulit(Cl,0), nbplit(Cl,0) <=> true(At).
|
|
|
|
true(At) \ pos(At,Cl), nbulit(Cl,NU), nbplit(Cl,NP)
|
|
<=>
|
|
NU1 is NU - 1, nbulit(Cl,NU1),
|
|
NP1 is NP - 1, nbplit(Cl,NP1).
|
|
|
|
false(At) \ neg(At,Cl), nbulit(Cl,NU)
|
|
<=>
|
|
NU1 is NU - 1, nbulit(Cl,NU1).
|
|
|
|
true(At) \ neg(At,Cl), aclause(Cl,OAt), nbulit(Cl,_), nbplit(Cl,_), nbucl(OAt,N)
|
|
<=>
|
|
N1 is N - 1, nbucl(OAt,N1).
|
|
|
|
false(At) \ pos(At,Cl), aclause(Cl,OAt), nbulit(Cl,_), nbplit(Cl,_), nbucl(OAt,N)
|
|
<=>
|
|
N1 is N - 1, nbucl(OAt,N1).
|
|
|
|
witness2 \ witness2 <=> true.
|
|
phase2, nbucl(At,_) ==> witness2, undefined2(At).
|
|
phase2, pos(At,Cl) ==> pos2(At,Cl).
|
|
phase2, aclause(Cl,At) ==> aclause2(Cl,At).
|
|
phase2, nbplit(Cl,N) ==> nbplit2(Cl,N).
|
|
phase2, witness2 # ID <=> phase1 pragma passive(ID).
|
|
phase2 \ nbplit2(_,_) # ID <=> true pragma passive(ID).
|
|
phase2 \ aclause2(_,_) # ID <=> true pragma passive(ID).
|
|
phase2 <=> true.
|
|
|
|
|
|
true2(At), aclause2(Cl,At) \ pos2(_,Cl) <=> true.
|
|
true2(At) \ undefined2(At) <=> true.
|
|
aclause2(Cl,At), nbplit2(Cl,0) <=> true2(At).
|
|
true2(At) \ pos2(At,Cl), nbplit2(Cl,NP)
|
|
<=>
|
|
NP1 is NP - 1, nbplit2(Cl,NP1).
|
|
|
|
witness1 \ witness1 <=> true.
|
|
phase1, undefined2(At) # ID1 , aclause(Cl,At) # ID2 \ pos(_,Cl) # ID3 <=> true pragma passive(ID1), passive(ID2), passive(ID3).
|
|
phase1, undefined2(At) # ID1 , aclause(Cl,At) # ID2 \ neg(_,Cl) # ID3 <=> true pragma passive(ID1), passive(ID2), passive(ID3).
|
|
phase1, undefined2(At) # ID1 \ aclause(Cl,At) # ID2 , nbulit(Cl,_) # ID3, nbplit(Cl,_) # ID4 <=> true pragma passive(ID1), passive(ID2), passive(ID3), passive(ID4).
|
|
phase1 \ undefined2(At) # ID <=> witness1, false(At) pragma passive(ID).
|
|
phase1 \ true2(_) # ID <=> true pragma passive(ID).
|
|
phase1 \ aclause2(_,_) <=> true.
|
|
phase1 \ pos2(_,_) # ID <=> true pragma passive(ID).
|
|
phase1 \ nbplit2(_,_) # ID <=> true pragma passive(ID).
|
|
phase1, witness1 # ID <=> phase2 pragma passive(ID).
|
|
phase1 \ nbucl(At,_) # ID <=> undefined(At) pragma passive(ID).
|
|
phase1 \ pos(_,_) # ID <=> true.
|
|
phase1 \ neg(_,_) # ID <=> true pragma passive(ID).
|
|
phase1 \ aclause(_,_) # ID <=> true pragma passive(ID).
|
|
phase1 \ nbulit(_,_) # ID <=> true pragma passive(ID).
|
|
phase1 \ nbplit(_,_) # ID <=> true pragma passive(ID).
|
|
phase1 <=> true.
|
|
|
|
/*
|
|
p :- r.
|
|
r.
|
|
*/
|
|
program1 :-
|
|
nbucl(p,1), % aantal undefined clauses voor p
|
|
pos(r,cl1), % positief voorkomen van r in clause cl1
|
|
aclause(cl1,p), % clause cl1 defineert p
|
|
nbulit(cl1,1), % aantal undefined literals in cl1
|
|
nbplit(cl1,1), % aantal positieve undefined literals in cl1
|
|
nbucl(r,1),
|
|
aclause(cl2,r),
|
|
nbulit(cl2,0),
|
|
nbplit(cl2,0).
|
|
|
|
/*
|
|
p :- not r.
|
|
r.
|
|
*/
|
|
program2 :-
|
|
nbucl(p,1),
|
|
neg(r,cl1),
|
|
aclause(cl1,p),
|
|
nbulit(cl1,1),
|
|
nbplit(cl1,1),
|
|
nbucl(r,1),
|
|
aclause(cl2,r),
|
|
nbulit(cl2,0),
|
|
nbplit(cl2,0).
|
|
|
|
/*
|
|
p :- p.
|
|
*/
|
|
program3 :-
|
|
nbucl(p,1),
|
|
pos(p,cl1),
|
|
aclause(cl1,p),
|
|
nbulit(cl1,1),
|
|
nbplit(cl1,1).
|
|
|
|
/*
|
|
p :- not p.
|
|
*/
|
|
program4 :-
|
|
nbucl(p,1),
|
|
neg(p,cl1),
|
|
aclause(cl1,p),
|
|
nbulit(cl1,1),
|
|
nbplit(cl1,0).
|
|
|
|
/*
|
|
p :- q, not r.
|
|
q :- r, not p.
|
|
r :- p, not q.
|
|
*/
|
|
|
|
program5 :-
|
|
nbucl(p,1),
|
|
pos(p,cl3),
|
|
neg(p,cl2),
|
|
aclause(cl1,p),
|
|
nbulit(cl1,2),
|
|
nbplit(cl1,1),
|
|
nbucl(q,1),
|
|
pos(q,cl1),
|
|
neg(q,cl3),
|
|
aclause(cl2,q),
|
|
nbulit(cl2,2),
|
|
nbplit(cl2,1),
|
|
nbucl(r,1),
|
|
pos(r,cl2),
|
|
neg(r,cl1),
|
|
aclause(cl3,r),
|
|
nbulit(cl3,2),
|
|
nbplit(cl3,1).
|
|
|
|
|
|
main :-
|
|
main(1000).
|
|
|
|
main(N) :-
|
|
cputime(T1),
|
|
loop(N),
|
|
cputime(T2),
|
|
T is T2 - T1,
|
|
write(bench(wfs ,N , T,0,hprolog)),write('.'),nl.
|
|
|
|
loop(N) :-
|
|
( N =< 0 ->
|
|
true
|
|
;
|
|
( prog, fail ; true),
|
|
M is N - 1,
|
|
loop(M)
|
|
).
|
|
|
|
prog :-
|
|
findall(Clause,wfs:prog(Clause),Clauses),
|
|
process(Clauses,1),
|
|
setof(At,B^(wfs:prog(At :- B) ; wfs:prog(At), atom(At)),Ats),
|
|
process_atoms(Ats),
|
|
phase2.
|
|
|
|
process([],_).
|
|
process([C|Cs],N) :-
|
|
( C = (HAt :- B) ->
|
|
aclause(N,HAt),
|
|
conj2list(B,Literals,[]),
|
|
process_literals(Literals,N,NbULit,NbPLit),
|
|
nbulit(N,NbULit),
|
|
nbplit(N,NbPLit)
|
|
;
|
|
C = HAt,
|
|
aclause(N,HAt),
|
|
nbulit(N,0),
|
|
nbplit(N,0)
|
|
),
|
|
N1 is N + 1,
|
|
process(Cs,N1).
|
|
|
|
conj2list(G,L,T) :-
|
|
( G = (G1,G2) ->
|
|
conj2list(G1,L,T1),
|
|
conj2list(G2,T1,T)
|
|
;
|
|
L = [G|T]
|
|
).
|
|
|
|
process_literals([],_,0,0).
|
|
process_literals([L|R],Cl,U,P) :-
|
|
process_literals(R,Cl,U1,P1),
|
|
( L = (\+ At) ->
|
|
neg(At,Cl),
|
|
P = P1,
|
|
U is U1 + 1
|
|
;
|
|
pos(L,Cl),
|
|
P is P1 + 1,
|
|
U is U1 + 1
|
|
).
|
|
|
|
process_atoms([]).
|
|
process_atoms([A|As]) :-
|
|
findall(A,wfs:prog(A :- _),L),
|
|
length(L,N),
|
|
nbucl(A,N),
|
|
process_atoms(As).
|