| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | ! Copyright (C) 2008 Slava Pestov. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							|  |  |  | USING: arrays assocs math math.intervals kernel accessors | 
					
						
							| 
									
										
										
										
											2008-08-01 21:10:49 -04:00
										 |  |  | sequences namespaces classes classes.algebra | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | combinators words | 
					
						
							| 
									
										
										
										
											2008-08-07 07:34:28 -04:00
										 |  |  | compiler.tree | 
					
						
							|  |  |  | compiler.tree.propagation.info | 
					
						
							|  |  |  | compiler.tree.propagation.copy ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | IN: compiler.tree.propagation.constraints | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! A constraint is a statement about a value. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  | ! Maps constraints to constraints ("A implies B") | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | SYMBOL: constraints | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-28 07:31:26 -04:00
										 |  |  | GENERIC: assume* ( constraint -- )
 | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  | GENERIC: satisfied? ( constraint -- ? )
 | 
					
						
							| 
									
										
										
										
											2008-07-28 07:31:26 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: f assume* drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! satisfied? is inaccurate. It's just used to prevent infinite | 
					
						
							|  |  |  | ! loops so its only implemented for true-constraints and | 
					
						
							|  |  |  | ! false-constraints. | 
					
						
							|  |  |  | M: object satisfied? drop f ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : assume ( constraint -- ) dup satisfied? [ drop ] [ assume* ] if ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  | ! Boolean constraints | 
					
						
							|  |  |  | TUPLE: true-constraint value ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | : =t ( value -- constriant ) resolve-copy true-constraint boa ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-28 07:31:26 -04:00
										 |  |  | M: true-constraint assume* | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  |     [ \ f class-not <class-info> swap value>> refine-value-info ] | 
					
						
							| 
									
										
										
										
											2008-11-11 09:49:00 -05:00
										 |  |  |     [ constraints get assoc-stack [ assume ] when* ] | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  |     bi ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-28 07:31:26 -04:00
										 |  |  | M: true-constraint satisfied? | 
					
						
							|  |  |  |     value>> value-info class>> true-class? ;
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  | TUPLE: false-constraint value ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | : =f ( value -- constriant ) resolve-copy false-constraint boa ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-28 07:31:26 -04:00
										 |  |  | M: false-constraint assume* | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  |     [ \ f <class-info> swap value>> refine-value-info ] | 
					
						
							| 
									
										
										
										
											2008-11-11 09:49:00 -05:00
										 |  |  |     [ constraints get assoc-stack [ assume ] when* ] | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  |     bi ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  | M: false-constraint satisfied? | 
					
						
							| 
									
										
										
										
											2008-07-28 07:31:26 -04:00
										 |  |  |     value>> value-info class>> false-class? ;
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  | ! Class constraints | 
					
						
							|  |  |  | TUPLE: class-constraint value class ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | : is-instance-of ( value class -- constraint )
 | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  |     [ resolve-copy ] dip class-constraint boa ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-28 07:31:26 -04:00
										 |  |  | M: class-constraint assume* | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  |     [ class>> <class-info> ] [ value>> ] bi refine-value-info ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  | ! Interval constraints | 
					
						
							|  |  |  | TUPLE: interval-constraint value interval ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | : is-in-interval ( value interval -- constraint )
 | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  |     [ resolve-copy ] dip interval-constraint boa ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-28 07:31:26 -04:00
										 |  |  | M: interval-constraint assume* | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  |     [ interval>> <interval-info> ] [ value>> ] bi refine-value-info ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  | ! Literal constraints | 
					
						
							|  |  |  | TUPLE: literal-constraint value literal ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | : is-equal-to ( value literal -- constraint )
 | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  |     [ resolve-copy ] dip literal-constraint boa ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-28 07:31:26 -04:00
										 |  |  | M: literal-constraint assume* | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  |     [ literal>> <literal-info> ] [ value>> ] bi refine-value-info ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  | ! Implication constraints | 
					
						
							|  |  |  | TUPLE: implication p q ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | C: --> implication | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-28 07:31:26 -04:00
										 |  |  | : assume-implication ( p q -- )
 | 
					
						
							| 
									
										
										
										
											2008-11-11 09:49:00 -05:00
										 |  |  |     [ constraints get [ assoc-stack swap suffix ] 2keep peek set-at ] | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  |     [ satisfied? [ assume ] [ drop ] if ] 2bi ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-28 07:31:26 -04:00
										 |  |  | M: implication assume* | 
					
						
							|  |  |  |     [ q>> ] [ p>> ] bi assume-implication ;
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-28 07:31:26 -04:00
										 |  |  | ! Equivalence constraints | 
					
						
							|  |  |  | TUPLE: equivalence p q ;
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-28 07:31:26 -04:00
										 |  |  | C: <--> equivalence | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-28 07:31:26 -04:00
										 |  |  | M: equivalence assume* | 
					
						
							|  |  |  |     [ p>> ] [ q>> ] bi
 | 
					
						
							|  |  |  |     [ assume-implication ] | 
					
						
							|  |  |  |     [ swap assume-implication ] 2bi ;
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-28 07:31:26 -04:00
										 |  |  | ! Conjunction constraints -- sequences act as conjunctions | 
					
						
							|  |  |  | M: sequence assume* [ assume ] each ;
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-28 07:31:26 -04:00
										 |  |  | : /\ ( p q -- constraint ) 2array ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-22 05:45:03 -04:00
										 |  |  | ! Utilities | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | : t--> ( constraint boolean-value -- constraint' ) =t swap --> ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-24 00:50:21 -04:00
										 |  |  | : f--> ( constraint boolean-value -- constraint' ) =f swap --> ;
 |