108 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			108 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								% PATH CONSISTENCY to be used with time.pl
							 | 
						||
| 
								 | 
							
								% thom fruehwirth ECRC 921030,930212,930802,930804,930908,931216,931223
							 | 
						||
| 
								 | 
							
								% christian holzbaur 961022 more mods for Sicstus
							 | 
						||
| 
								 | 
							
								% thom fruehwirth LMU 980206, 980312
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- use_module(library(chr)).
							 | 
						||
| 
								 | 
							
								:- use_module( library('chr/ordering'), [globalize/1,var_compare/3]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								nonground( X) :- \+ ground( X).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								handler path_consistency.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								constraints arc/4, path/6.
							 | 
						||
| 
								 | 
							
								% arc(X,Y,L,T) there is an arc in the constraint network between variables X and Y with constraint L of type T
							 | 
						||
| 
								 | 
							
								% path(N,X,Y,L,T,I) there is a path in the constraint network between variables X and Y with constraint L of type T
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%% start up
							 | 
						||
| 
								 | 
							
								add_path @
							 | 
						||
| 
								 | 
							
								arc(X,Y,L,T) <=> ground(L),ground(T),length(L,N) |
							 | 
						||
| 
								 | 
							
									globalize(X-Y),	% attach attribute to vars to have order on them
							 | 
						||
| 
								 | 
							
									path(N,X,Y,L,T,1).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%% ground case
							 | 
						||
| 
								 | 
							
								ground @
							 | 
						||
| 
								 | 
							
								path(N,X,Y,L,T,I) <=> ground(X-Y-L-T) | path1(N,X,Y,L,T,I).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%% simple cases
							 | 
						||
| 
								 | 
							
								empty @
							 | 
						||
| 
								 | 
							
								path(N,X,Y,L,T,I) <=> empty(N,L,T) | fail.
							 | 
						||
| 
								 | 
							
								universal @
							 | 
						||
| 
								 | 
							
								path(N,X,Y,L,T,I) <=> universal(N,L,T) | true.
							 | 
						||
| 
								 | 
							
								equality @
							 | 
						||
| 
								 | 
							
								path(N,X,X,L,T,I) <=> equality(L,T).
							 | 
						||
| 
								 | 
							
								unify @
							 | 
						||
| 
								 | 
							
								path(1,X,Y,L,T,I) <=> unique(L),equality(L,T) | X=Y. % can cause problems with var order
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%% special cases for finite domains
							 | 
						||
| 
								 | 
							
								findom_unique @
							 | 
						||
| 
								 | 
							
								path(1,X,Y,L,p-p,I) <=> number(X),unique(L) | bind_value(X,Y,L).
							 | 
						||
| 
								 | 
							
								findom_x @
							 | 
						||
| 
								 | 
							
								path(N,X,Y,L,p-p,I) <=> number(X),X=\=0
							 | 
						||
| 
								 | 
							
								        |
							 | 
						||
| 
								 | 
							
									shift_interval(X,L,L1),
							 | 
						||
| 
								 | 
							
								        path(N,0,Y,L1,p-p,I).
							 | 
						||
| 
								 | 
							
								findom_y @
							 | 
						||
| 
								 | 
							
								path(N,Y,X,L,p-p,I) <=> number(X)
							 | 
						||
| 
								 | 
							
								        |
							 | 
						||
| 
								 | 
							
								        equality([Eq],p-p),transl(L,L2,[Eq],p-p-p), % invert path
							 | 
						||
| 
								 | 
							
								        shift_interval(X,L2,L1),
							 | 
						||
| 
								 | 
							
								        path(N,0,Y,L1,p-p,I).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%% intersection (has to come before transitivity)
							 | 
						||
| 
								 | 
							
								intersect_xy_xy @
							 | 
						||
| 
								 | 
							
								path(N1, X, Y, L1, U-V, I), path(N2, X, Y, L2, U-V, J) <=> % 10
							 | 
						||
| 
								 | 
							
									intersection(L1, L2, L3, U-V),
							 | 
						||
| 
								 | 
							
									length(L3, N3),
							 | 
						||
| 
								 | 
							
									K is min(I, J),
							 | 
						||
| 
								 | 
							
									path(N3, X, Y, L3, U-V, K)
							 | 
						||
| 
								 | 
							
								    pragma already_in_heads.
							 | 
						||
| 
								 | 
							
								intersect_yx_xy @
							 | 
						||
| 
								 | 
							
								path(N1, Y, X, L1, U-V, I), path(N2, X, Y, L, V-U, J) <=> % 11
							 | 
						||
| 
								 | 
							
									equality([Eq], V-V), transl(L, L2, [Eq], V-U-V),  % invert 2nd path
							 | 
						||
| 
								 | 
							
									intersection(L1, L2, L3, U-V),
							 | 
						||
| 
								 | 
							
									length(L3, N3),
							 | 
						||
| 
								 | 
							
									K is min(I, J),
							 | 
						||
| 
								 | 
							
									path(N3, Y, X, L3, U-V, K).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%% transitivity
							 | 
						||
| 
								 | 
							
								propagate_xy_yz @
							 | 
						||
| 
								 | 
							
								path(N1, X, Y, L1, U-V, I), path(N2, Y, Z, L2, V-W, J) ==>
							 | 
						||
| 
								 | 
							
									nonground(Y),
							 | 
						||
| 
								 | 
							
									J=1, (I=1 -> var_compare( <, X, Z) ; true) % or J=1 or N2=1 or X@<Z
							 | 
						||
| 
								 | 
							
								        |
							 | 
						||
| 
								 | 
							
									transl(L1, L2, L3, U-V-W),
							 | 
						||
| 
								 | 
							
									length(L3, M),
							 | 
						||
| 
								 | 
							
									K is I+J,
							 | 
						||
| 
								 | 
							
									path(M, X, Z, L3, U-W, K).
							 | 
						||
| 
								 | 
							
								propagate_xy_xz @
							 | 
						||
| 
								 | 
							
								path(N1, X, Y, L1, U-V, I), path(N2, X, Z, L3, U-W, J) ==>
							 | 
						||
| 
								 | 
							
									nonground(X),
							 | 
						||
| 
								 | 
							
									min(I, J)=:=1, var_compare( <, Y, Z)  	   % or J=1 or N2=1
							 | 
						||
| 
								 | 
							
								        |
							 | 
						||
| 
								 | 
							
									transl(L1, L2, L3, U-V-W),
							 | 
						||
| 
								 | 
							
									length(L2, M),
							 | 
						||
| 
								 | 
							
									K is I+J,
							 | 
						||
| 
								 | 
							
									path(M, Y, Z, L2, V-W, K).
							 | 
						||
| 
								 | 
							
								propagate_xy_zy @
							 | 
						||
| 
								 | 
							
								path(N1, X, Y, L3, U-V, I), path(N2, Z, Y, L2, W-V, J) ==>
							 | 
						||
| 
								 | 
							
									nonground(Y),
							 | 
						||
| 
								 | 
							
									min(I, J)=:=1, var_compare( <, X, Z)      % or J=1 or N2=1
							 | 
						||
| 
								 | 
							
								        |
							 | 
						||
| 
								 | 
							
									transl(L1, L2, L3, U-W-V),
							 | 
						||
| 
								 | 
							
									length(L1, M),
							 | 
						||
| 
								 | 
							
									K is I+J,
							 | 
						||
| 
								 | 
							
									path(M, X, Z, L1, U-W, K).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%% labeling by choice of primitive relation
							 | 
						||
| 
								 | 
							
								constraints labeling/0.
							 | 
						||
| 
								 | 
							
								labeling, path(N, X, Y, L, T, I)#Id <=> N>1 |	
							 | 
						||
| 
								 | 
							
								      member(R, L), 
							 | 
						||
| 
								 | 
							
									path(1, X, Y, [R], T, I),
							 | 
						||
| 
								 | 
							
									  labeling
							 | 
						||
| 
								 | 
							
								      pragma passive(Id).
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*--------------- eof pc.chr ------------------------------------------------*/
							 |