176 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			176 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | 
 | ||
|  | /* | ||
|  |  ********************************************************************** | ||
|  |  * | ||
|  |  *      CLP(R) Version 2.0	(Example Programs Release) | ||
|  |  *	(C) Copyright, March 1986, Monash University | ||
|  |  * | ||
|  |  ********************************************************************** | ||
|  |  */ | ||
|  | 
 | ||
|  | % | ||
|  | % Convert a propositional formula into disjunctive normal form. | ||
|  | % There are 15 goals     ?- go1     to    ?- go 15. | ||
|  | % The goal      ?- go5      is the most substantial. | ||
|  | % | ||
|  | 
 | ||
|  | literal(z0). | ||
|  | literal(z1). | ||
|  | literal(z2). | ||
|  | literal(z3). | ||
|  | literal(z4). | ||
|  | literal(z5). | ||
|  | literal(z6). | ||
|  | literal(z7). | ||
|  | literal(z8). | ||
|  | literal(z9). | ||
|  | literal(n(X))  :-  literal(X). | ||
|  | 
 | ||
|  | /*---------------------------------------------- base cases ------------------*/ | ||
|  | 
 | ||
|  | norm(X, X)  :- literal(X). | ||
|  | norm(o(X, Y), o(X, Y))  :- literal(X), literal(Y). | ||
|  | norm(a(X, Y), a(X, Y))  :- literal(X), literal(Y). | ||
|  | 
 | ||
|  | /*---------------------------------------------- OR cases --------------------*/ | ||
|  | 
 | ||
|  | norm(o(X, Y), o(X1, Y))  :- | ||
|  | 	literal(Y), | ||
|  | 	norm(X, X1). | ||
|  | norm(o(X, o(Y, Z)), W)  :- | ||
|  | 	norm(o(o(X, Y), Z), W). | ||
|  | norm(o(X, a(Y1, Y2)), o(X1, Y12))  :- | ||
|  | 	norm(X, X1), | ||
|  | 	norm(a(Y1, Y2), Y12). | ||
|  | 
 | ||
|  | /*---------------------------------------------- AND cases -------------------*/ | ||
|  | 
 | ||
|  | norm(a(X, Y), a(X1, Y))  :- | ||
|  | 	literal(Y), | ||
|  | 	norm(X, X1). | ||
|  | norm(a(X, a(Y, Z)), W)  :- | ||
|  | 	norm(a(a(X, Y), Z), W). | ||
|  | norm(a(X, o(Y1, Y2)), a(X1, Y12))  :- | ||
|  | 	norm(X, X1), | ||
|  | 	norm(o(Y1, Y2), Y12). | ||
|  | 
 | ||
|  | /*----------------------------------------------------------------------------*/ | ||
|  | /*----------------------------------------------------------------------------*/ | ||
|  | /*---------------------------------------------- base cases ------------------*/ | ||
|  | 
 | ||
|  | dnf(X, X)  :-  literal(X). | ||
|  | dnf(o(X, Y), o(X, Y))  :-  literal(X), literal(Y). | ||
|  | dnf(a(X, Y), a(X, Y))  :-  literal(X), literal(Y). | ||
|  | 
 | ||
|  | /*---------------------------------------------- compaction ------------------*/ | ||
|  | 
 | ||
|  | dnf(n(n(X)), W)  :-  dnf(X, W). | ||
|  | dnf(n(o(X, Y)), W)  :-  dnf(a(n(X), n(Y)), W). | ||
|  | dnf(n(a(X, Y)), W)  :-  dnf(o(n(X), n(Y)), W). | ||
|  | 
 | ||
|  | /*----------------------------------------------------------------------------*/ | ||
|  | 
 | ||
|  | dnf(o(X, Y), W)  :- | ||
|  | 	dnf(X, X1), | ||
|  | 	dnf(Y, Y1), | ||
|  | 	norm(o(X1, Y1), W). | ||
|  | dnf(a(X, Y), a(a(X1, X2), Y))  :- | ||
|  | 	literal(Y), | ||
|  | 	dnf(X, a(X1, X2)). | ||
|  | dnf(a(X, Y), a(a(Y1, Y2), X))  :- | ||
|  | 	literal(X), | ||
|  | 	dnf(Y, a(Y1, Y2)). | ||
|  | dnf(a(X, Y), W)  :- | ||
|  | 	dnf(X, a(X1, X2)), | ||
|  | 	dnf(Y, a(Y1, Y2)), | ||
|  | 	norm(a(a(X1, X2), a(Y1, Y2)), W). | ||
|  | dnf(a(X, Y), W)  :- | ||
|  | 	dnf(X, o(X1, X2)), | ||
|  | 	dnf(Y, Y1), | ||
|  | 	dnf(o(a(X1, Y1), a(X2, Y1)), W). | ||
|  | dnf(a(X, Y), W)  :- | ||
|  | 	dnf(X, X1), | ||
|  | 	dnf(Y, o(Y1, Y2)), | ||
|  | 	dnf(o(a(X1, Y1), a(X1, Y2)), W). | ||
|  | 
 | ||
|  | go1:-  dnf(a(z1, a(z2, o(z3, a(z4, a(z5, z6))))), X), | ||
|  | 	printf("%\n", [X]). | ||
|  | go2:-  dnf(o(o(z1,o(z2,o(z3,z4))),o(z5,o(z6,o(z7,z8)))),X), | ||
|  | 	printf("%\n", [X]). | ||
|  | go3:-  dnf(o(o(a(z1,z2),z3),o(a(z4,a(a(z5,z6),z7)),o(z8,z9))),X), | ||
|  | 	printf("%\n", [X]). | ||
|  | go4:-  dnf(a(a(z1,a(o(z2,z3),z4)),a(z5,o(z6,z7))),X), | ||
|  | 	printf("%\n", [X]). | ||
|  | go5:-  dnf(n(o(a(n(o(z1,z2)),n(a(z3,z4))),a(n(z5),o(a(z6,a(z7,z8)),z9)))),X), | ||
|  | 	dnf(n(o(a(n(o(z1,z2)),n(a(z3,z4))),a(n(z5),o(a(z6,a(z7,z8)),z9)))),X), | ||
|  | 	printf("%\n", [X]). | ||
|  | go6:-  dnf(n(a(z1,a(z2,z3))),X), | ||
|  | 	printf("%\n", [X]). | ||
|  | go7:-  dnf(a(a(o(z1,z2),z3),z4),X), | ||
|  | 	printf("%\n", [X]). | ||
|  | go8:-  dnf(o(a(z1,z2),a(z3,z4)),X), | ||
|  | 	printf("%\n", [X]). | ||
|  | go9:-  dnf(a(o(z1,z2),o(z3,z4)),X), | ||
|  | 	printf("%\n", [X]). | ||
|  | go10:-  dnf(o(a(o(z1,z2),a(z3,z4)),z5),X), | ||
|  | 	printf("%\n", [X]). | ||
|  | go11:-  dnf(o(o(z1,o(z3,o(z4,a(z4,z5)))),z5),X), | ||
|  | 	printf("%\n", [X]). | ||
|  | go12:-  dnf(o(z1,o(z2,o(z3,z4))),X), | ||
|  | 	printf("%\n", [X]). | ||
|  | go13:-  dnf(o(a(z1,z2),n(o(z2,a(z3,z4)))),X), | ||
|  | 	printf("%\n", [X]). | ||
|  | go14:-  dnf(o(a(n(z0),n(z1)),a(n(z0),n(z2))),X), | ||
|  | 	printf("%\n", [X]). | ||
|  | go15:-  dnf(o(n(a(z1,z2)),a(o(a(o(z1,z2),z3),z4),z5)),X), | ||
|  | 	printf("%\n", [X]). | ||
|  | 
 | ||
|  | % Answers: | ||
|  | %  1 ?- go1. | ||
|  | %  o(a(a(z2, z3), z1), a(a(a(a(z5, z6), z4), z2), z1)) | ||
|  | % | ||
|  | %  2 ?- go2. | ||
|  | %  o(o(o(o(o(o(o(z1, z2), z3), z4), z5), z6), z7), z8) | ||
|  | % | ||
|  | %  3 ?- go3. | ||
|  | %  o(o(o(o(a(z1, z2), z3), a(a(a(z5, z6), z7), z4)), z8), z9) | ||
|  | %   | ||
|  | %  4 ?- go4. | ||
|  | %  o(o(o(a(a(a(a(z2, z4), z1), z5), z6), a(a(a(a(z2, z4), z1), z5), z7)), a(a(a(a(z3, z4), z1), z5), z6)), a(a(a(a(z3, z4), z1), z5), z7)) | ||
|  | %   | ||
|  | %  5 ?- go5. | ||
|  | %  o(o(o(o(o(o(o(o(o(o(o(a(z1, n(n(z5))), a(a(n(z6), n(z9)), z1)), a(a(n(z7), n(z9)), z1)), a(a(n(z8), n(z9)), z1)), a(z2, n(n(z5)))), a(a(n(z6), n(z9)), z2)), a(a(n(z7), n(z9)), z2)), a(a(n(z8), n(z9)), z2)), a(a(z3, z4), n(n(z5)))), a(a(a(z3, z4), n(z6)), n(z9))), a(a(a(z3, z4), n(z7)), n(z9))), a(a(a(z3, z4), n(z8)), n(z9))) | ||
|  | %   | ||
|  | %  6 ?- go6. | ||
|  | %  o(o(n(z1), n(z2)), n(z3)) | ||
|  | %   | ||
|  | %  7 ?- go7. | ||
|  | %  o(a(a(z1, z3), z4), a(a(z2, z3), z4)) | ||
|  | %   | ||
|  | %  8 ?- go8. | ||
|  | %  o(a(z1, z2), a(z3, z4)) | ||
|  | %   | ||
|  | %  9 ?- go9. | ||
|  | %  o(o(o(a(z1, z3), a(z1, z4)), a(z2, z3)), a(z2, z4)) | ||
|  | %   | ||
|  | %  10 ?- go10. | ||
|  | %  o(o(a(a(z3, z4), z1), a(a(z3, z4), z2)), z5) | ||
|  | %   | ||
|  | %  11 ?- go11. | ||
|  | %  o(o(o(o(z1, z3), z4), a(z4, z5)), z5) | ||
|  | %   | ||
|  | %  12 ?- go12. | ||
|  | %  o(o(o(z1, z2), z3), z4) | ||
|  | %   | ||
|  | %  13 ?- go13. | ||
|  | %  o(o(a(z1, z2), a(n(z2), n(z3))), a(n(z2), n(z4))) | ||
|  | %   | ||
|  | %  14 ?- go14. | ||
|  | %  o(a(n(z0), n(z1)), a(n(z0), n(z2))) | ||
|  | %   | ||
|  | %  15 ?- go15. | ||
|  | %  o(o(o(o(n(z1), n(z2)), a(a(z1, z3), z5)), a(a(z2, z3), z5)), a(z4, z5)) | ||
|  | %   | ||
|  | 
 | ||
|  | ?- printf("\n>>> Sample goals: go1/0, ..., go15/0\n", []). |