108 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			108 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
							 | 
						||
| 
								 | 
							
								%  clp(q,r)                                         version 1.3.2 %
							 | 
						||
| 
								 | 
							
								%                                                                 %
							 | 
						||
| 
								 | 
							
								%  (c) Copyright 1992,1993,1994,1995                              %
							 | 
						||
| 
								 | 
							
								%  Austrian Research Institute for Artificial Intelligence (OFAI) %
							 | 
						||
| 
								 | 
							
								%  Schottengasse 3                                                %
							 | 
						||
| 
								 | 
							
								%  A-1010 Vienna, Austria                                         %
							 | 
						||
| 
								 | 
							
								%                                                                 %
							 | 
						||
| 
								 | 
							
								%  File:   squares.pl                                             %
							 | 
						||
| 
								 | 
							
								%  Author: Christian Holzbaur           christian@ai.univie.ac.at %
							 | 
						||
| 
								 | 
							
								%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								This beautiful example of disequations at work is due
							 | 
						||
| 
								 | 
							
								to [Colmerauer 90]. It addresses the task of tiling a rectangle
							 | 
						||
| 
								 | 
							
								with squares of all-different, a priori unknown sizes. Here is a
							 | 
						||
| 
								 | 
							
								translation of the original Prolog-III program to clp(q,r)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[Colmerauer 90]
							 | 
						||
| 
								 | 
							
									Colmerauer A.: An Introduction to Prolog III,
							 | 
						||
| 
								 | 
							
									Communications of the ACM, 33(7), 69-90, 1990.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								| ?- length(L,9),filled_rectangle(A,L).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A = 33/32,
							 | 
						||
| 
								 | 
							
								L = [15/32,9/16,1/4,7/32,1/8,7/16,1/32,5/16,9/32] ? ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A = 69/61,
							 | 
						||
| 
								 | 
							
								L = [33/61,36/61,28/61,5/61,2/61,9/61,25/61,7/61,16/61] ?
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								rectangle( A, Rs) :-
							 | 
						||
| 
								 | 
							
								  Rs = [X1,X2,X3,X4,X5,X6,X7,X8,X9],
							 | 
						||
| 
								 | 
							
								  filled_rectangle( A, Rs).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								filled_rectangle( A, C) :-
							 | 
						||
| 
								 | 
							
								  { A >= 1 },
							 | 
						||
| 
								 | 
							
								  distinct_squares( C), 			% also acts as generator [], [_], [_,_], ...
							 | 
						||
| 
								 | 
							
								  filled_zone( [-1,A,1], _, C, []).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								distinct_squares( []).
							 | 
						||
| 
								 | 
							
								distinct_squares( [B|C]) :-
							 | 
						||
| 
								 | 
							
								  { B > 0 },
							 | 
						||
| 
								 | 
							
								  outof( C, B),
							 | 
						||
| 
								 | 
							
								  distinct_squares( C).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								outof( [],     _).
							 | 
						||
| 
								 | 
							
								outof( [B1|C], B) :-
							 | 
						||
| 
								 | 
							
								  { B =\= B1 },
							 | 
						||
| 
								 | 
							
								  outof( C, B).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								filled_zone( [V|L], [V|L], C0, C0) :-
							 | 
						||
| 
								 | 
							
								  { V >= 0 }.
							 | 
						||
| 
								 | 
							
								filled_zone( [V|L], L3, [B|C], C2) :-
							 | 
						||
| 
								 | 
							
								  { V < 0 },
							 | 
						||
| 
								 | 
							
								  placed_square( B, L, L1),
							 | 
						||
| 
								 | 
							
								  filled_zone( L1, L2, C, C1),
							 | 
						||
| 
								 | 
							
								  { Vb=V+B },
							 | 
						||
| 
								 | 
							
								  filled_zone( [Vb,B|L2], L3, C1, C2).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								placed_square( B, [H,H0,H1|L], L1) :-
							 | 
						||
| 
								 | 
							
								  { B > H, H0=0, H2=H+H1 },
							 | 
						||
| 
								 | 
							
								  placed_square( B, [H2|L], L1).
							 | 
						||
| 
								 | 
							
								placed_square( B, [B,V|L], [X|L]) :-
							 | 
						||
| 
								 | 
							
								  { X=V-B }.
							 | 
						||
| 
								 | 
							
								placed_square( B, [H|L], [X,Y|L]) :-
							 | 
						||
| 
								 | 
							
								  { B < H, X= -B, Y=H-B }.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								% first nontrivial solution has 21 squares ...
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								perfect( S) :-
							 | 
						||
| 
								 | 
							
								  { A = 1 },
							 | 
						||
| 
								 | 
							
								  distinct_squares( S),
							 | 
						||
| 
								 | 
							
								  length( S, Len), Len > 1,
							 | 
						||
| 
								 | 
							
								  print( try(Len)), nl,
							 | 
						||
| 
								 | 
							
								  flush_output,
							 | 
						||
| 
								 | 
							
								  time( filled_zone( [-1,A,1], _, S, [])).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								try(2)
							 | 
						||
| 
								 | 
							
								%%% Timing 00:00:00.030     0.030
							 | 
						||
| 
								 | 
							
								try(3)
							 | 
						||
| 
								 | 
							
								%%% Timing 00:00:00.070     0.070
							 | 
						||
| 
								 | 
							
								try(4)
							 | 
						||
| 
								 | 
							
								%%% Timing 00:00:00.270     0.270
							 | 
						||
| 
								 | 
							
								try(5)
							 | 
						||
| 
								 | 
							
								%%% Timing 00:00:01.060     1.060
							 | 
						||
| 
								 | 
							
								try(6)
							 | 
						||
| 
								 | 
							
								%%% Timing 00:00:04.470     4.470
							 | 
						||
| 
								 | 
							
								try(7)
							 | 
						||
| 
								 | 
							
								%%% Timing 00:00:19.960    19.960
							 | 
						||
| 
								 | 
							
								try(8)
							 | 
						||
| 
								 | 
							
								%%% Timing 00:01:33.380    93.380
							 | 
						||
| 
								 | 
							
								try(9)
							 | 
						||
| 
								 | 
							
								%%% Timing 00:07:27.380   447.380
							 | 
						||
| 
								 | 
							
								try(10)
							 | 
						||
| 
								 | 
							
								%%% Timing 00:37:03.770  2223.770
							 | 
						||
| 
								 | 
							
								try(11)
							 | 
						||
| 
								 | 
							
								%%% Timing 03:11:38.380 11498.380
							 | 
						||
| 
								 | 
							
								try(12)
							 | 
						||
| 
								 | 
							
								%%% Timing 16:18:43.110 58723.110
							 | 
						||
| 
								 | 
							
								*/
							 |