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). |