| 
									
										
										
										
											2009-02-19 17:48:46 -05:00
										 |  |  | ! Copyright (C) 2008, 2009 Doug Coleman, Daniel Ehrenberg. | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2009-02-21 18:13:11 -05:00
										 |  |  | USING: accessors kernel math math.order words combinators locals | 
					
						
							| 
									
										
										
										
											2009-03-03 20:22:53 -05:00
										 |  |  | ascii unicode.categories combinators.short-circuit sequences | 
					
						
							| 
									
										
										
										
											2009-03-18 17:09:45 -04:00
										 |  |  | fry macros arrays assocs sets classes mirrors unicode.script | 
					
						
							|  |  |  | unicode.data ;
 | 
					
						
							| 
									
										
										
										
											2008-09-18 15:42:16 -04:00
										 |  |  | IN: regexp.classes | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-17 20:39:04 -04:00
										 |  |  | SINGLETONS: dot letter-class LETTER-class Letter-class digit-class | 
					
						
							| 
									
										
										
										
											2008-11-24 23:17:47 -05:00
										 |  |  | alpha-class non-newline-blank-class | 
					
						
							|  |  |  | ascii-class punctuation-class java-printable-class blank-class | 
					
						
							|  |  |  | control-character-class hex-digit-class java-blank-class c-identifier-class | 
					
						
							|  |  |  | unmatchable-class terminator-class word-boundary-class ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-17 20:39:04 -04:00
										 |  |  | SINGLETONS: beginning-of-input ^ end-of-input $ end-of-file | 
					
						
							|  |  |  | ^unix $unix word-break ;
 | 
					
						
							| 
									
										
										
										
											2008-11-24 23:17:47 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-18 17:09:45 -04:00
										 |  |  | TUPLE: range-class from to ;
 | 
					
						
							|  |  |  | C: <range-class> range-class | 
					
						
							| 
									
										
										
										
											2008-11-24 23:17:47 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-17 20:39:04 -04:00
										 |  |  | TUPLE: primitive-class class ;
 | 
					
						
							|  |  |  | C: <primitive-class> primitive-class | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: category-class category ;
 | 
					
						
							|  |  |  | C: <category-class> category-class | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: category-range-class category ;
 | 
					
						
							|  |  |  | C: <category-range-class> category-range-class | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: script-class script ;
 | 
					
						
							|  |  |  | C: <script-class> script-class | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | GENERIC: class-member? ( obj class -- ? )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-23 14:10:38 -05:00
										 |  |  | M: t class-member? ( obj class -- ? ) 2drop t ;
 | 
					
						
							| 
									
										
										
										
											2008-11-24 01:18:27 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-19 17:48:46 -05:00
										 |  |  | M: integer class-member? ( obj class -- ? ) = ;
 | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-18 17:09:45 -04:00
										 |  |  | M: range-class class-member? ( obj class -- ? )
 | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  |     [ from>> ] [ to>> ] bi between? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: letter-class class-member? ( obj class -- ? )
 | 
					
						
							|  |  |  |     drop letter? ;
 | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  | M: LETTER-class class-member? ( obj class -- ? )
 | 
					
						
							|  |  |  |     drop LETTER? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: Letter-class class-member? ( obj class -- ? )
 | 
					
						
							|  |  |  |     drop Letter? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: ascii-class class-member? ( obj class -- ? )
 | 
					
						
							|  |  |  |     drop ascii? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: digit-class class-member? ( obj class -- ? )
 | 
					
						
							|  |  |  |     drop digit? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-20 18:54:48 -05:00
										 |  |  | : c-identifier-char? ( ch -- ? )
 | 
					
						
							|  |  |  |     { [ alpha? ] [ CHAR: _ = ] } 1|| ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-18 16:10:24 -05:00
										 |  |  | M: c-identifier-class class-member? ( obj class -- ? )
 | 
					
						
							| 
									
										
										
										
											2009-02-20 18:54:48 -05:00
										 |  |  |     drop c-identifier-char? ;
 | 
					
						
							| 
									
										
										
										
											2008-11-18 16:10:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | M: alpha-class class-member? ( obj class -- ? )
 | 
					
						
							|  |  |  |     drop alpha? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-20 18:54:48 -05:00
										 |  |  | : punct? ( ch -- ? )
 | 
					
						
							|  |  |  |     "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" member? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | M: punctuation-class class-member? ( obj class -- ? )
 | 
					
						
							|  |  |  |     drop punct? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-20 18:54:48 -05:00
										 |  |  | : java-printable? ( ch -- ? )
 | 
					
						
							|  |  |  |     { [ alpha? ] [ punct? ] } 1|| ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | M: java-printable-class class-member? ( obj class -- ? )
 | 
					
						
							|  |  |  |     drop java-printable? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: non-newline-blank-class class-member? ( obj class -- ? )
 | 
					
						
							|  |  |  |     drop { [ blank? ] [ CHAR: \n = not ] } 1&& ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: control-character-class class-member? ( obj class -- ? )
 | 
					
						
							| 
									
										
										
										
											2009-02-15 15:28:22 -05:00
										 |  |  |     drop control? ;
 | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-20 18:54:48 -05:00
										 |  |  | : hex-digit? ( ch -- ? )
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         [ CHAR: A CHAR: F between? ] | 
					
						
							|  |  |  |         [ CHAR: a CHAR: f between? ] | 
					
						
							|  |  |  |         [ CHAR: 0 CHAR: 9 between? ] | 
					
						
							|  |  |  |     } 1|| ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | M: hex-digit-class class-member? ( obj class -- ? )
 | 
					
						
							|  |  |  |     drop hex-digit? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-20 18:54:48 -05:00
										 |  |  | : java-blank? ( ch -- ? )
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         CHAR: \s CHAR: \t CHAR: \n
 | 
					
						
							|  |  |  |         HEX: b HEX: 7 CHAR: \r
 | 
					
						
							|  |  |  |     } member? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | M: java-blank-class class-member? ( obj class -- ? )
 | 
					
						
							|  |  |  |     drop java-blank? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: unmatchable-class class-member? ( obj class -- ? )
 | 
					
						
							|  |  |  |     2drop f ;
 | 
					
						
							| 
									
										
										
										
											2008-11-24 01:18:27 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: terminator-class class-member? ( obj class -- ? )
 | 
					
						
							| 
									
										
										
										
											2009-02-20 18:54:48 -05:00
										 |  |  |     drop "\r\n\u000085\u002029\u002028" member? ;
 | 
					
						
							| 
									
										
										
										
											2008-11-24 23:17:47 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-17 20:39:04 -04:00
										 |  |  | M: f class-member? 2drop f ;
 | 
					
						
							| 
									
										
										
										
											2008-11-24 23:17:47 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-20 20:03:26 -04:00
										 |  |  | : same? ( obj1 obj2 quot1: ( obj1 -- val1 ) quot2: ( obj2 -- val2 ) -- ? )
 | 
					
						
							|  |  |  |     bi* = ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-17 20:39:04 -04:00
										 |  |  | M: script-class class-member? | 
					
						
							| 
									
										
										
										
											2009-03-20 20:03:26 -04:00
										 |  |  |     [ script-of ] [ script>> ] same? ;
 | 
					
						
							| 
									
										
										
										
											2009-02-19 17:48:46 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-17 20:39:04 -04:00
										 |  |  | M: category-class class-member? | 
					
						
							| 
									
										
										
										
											2009-03-20 20:03:26 -04:00
										 |  |  |     [ category ] [ category>> ] same? ;
 | 
					
						
							| 
									
										
										
										
											2009-02-21 18:13:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-17 20:39:04 -04:00
										 |  |  | M: category-range-class class-member? | 
					
						
							| 
									
										
										
										
											2009-03-20 20:03:26 -04:00
										 |  |  |     [ category first ] [ category>> ] same? ;
 | 
					
						
							| 
									
										
										
										
											2009-02-21 18:13:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-19 17:48:46 -05:00
										 |  |  | TUPLE: not-class class ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  | PREDICATE: not-integer < not-class class>> integer? ;
 | 
					
						
							| 
									
										
										
										
											2009-03-18 17:09:45 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | UNION: simple-class | 
					
						
							| 
									
										
										
										
											2009-03-20 20:03:26 -04:00
										 |  |  |     primitive-class range-class dot ;
 | 
					
						
							| 
									
										
										
										
											2009-03-18 17:09:45 -04:00
										 |  |  | PREDICATE: not-simple < not-class class>> simple-class? ;
 | 
					
						
							| 
									
										
										
										
											2009-02-21 18:13:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  | M: not-class class-member? | 
					
						
							|  |  |  |     class>> class-member? not ;
 | 
					
						
							| 
									
										
										
										
											2009-02-21 18:13:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  | TUPLE: or-class seq ;
 | 
					
						
							| 
									
										
										
										
											2009-02-21 18:13:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  | M: or-class class-member? | 
					
						
							|  |  |  |     seq>> [ class-member? ] with any? ;
 | 
					
						
							| 
									
										
										
										
											2009-02-21 18:13:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  | TUPLE: and-class seq ;
 | 
					
						
							| 
									
										
										
										
											2009-02-21 18:13:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  | M: and-class class-member? | 
					
						
							|  |  |  |     seq>> [ class-member? ] with all? ;
 | 
					
						
							| 
									
										
										
										
											2009-02-23 14:10:38 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  | DEFER: substitute | 
					
						
							| 
									
										
										
										
											2009-02-21 18:13:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-03 20:22:53 -05:00
										 |  |  | : flatten ( seq class -- newseq )
 | 
					
						
							|  |  |  |     '[ dup _ instance? [ seq>> ] [ 1array ] if ] map concat ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-09 16:44:11 -04:00
										 |  |  | :: seq>instance ( seq empty class -- instance )
 | 
					
						
							|  |  |  |     seq length { | 
					
						
							|  |  |  |         { 0 [ empty ] } | 
					
						
							|  |  |  |         { 1 [ seq first ] } | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  |         [ drop class new seq { } like >>seq ] | 
					
						
							| 
									
										
										
										
											2009-03-09 16:44:11 -04:00
										 |  |  |     } case ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-18 17:09:45 -04:00
										 |  |  | TUPLE: class-partition integers not-integers simples not-simples and or other ;
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : partition-classes ( seq -- class-partition )
 | 
					
						
							|  |  |  |     prune | 
					
						
							|  |  |  |     [ integer? ] partition
 | 
					
						
							|  |  |  |     [ not-integer? ] partition
 | 
					
						
							| 
									
										
										
										
											2009-03-18 17:09:45 -04:00
										 |  |  |     [ simple-class? ] partition
 | 
					
						
							|  |  |  |     [ not-simple? ] partition
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  |     [ and-class? ] partition
 | 
					
						
							|  |  |  |     [ or-class? ] partition
 | 
					
						
							|  |  |  |     class-partition boa ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : class-partition>seq ( class-partition -- seq )
 | 
					
						
							|  |  |  |     make-mirror values concat ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : repartition ( partition -- partition' )
 | 
					
						
							|  |  |  |     ! This could be made more efficient; only and and or are effected | 
					
						
							|  |  |  |     class-partition>seq partition-classes ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : filter-not-integers ( partition -- partition' )
 | 
					
						
							|  |  |  |     dup
 | 
					
						
							| 
									
										
										
										
											2009-03-18 17:09:45 -04:00
										 |  |  |     [ simples>> ] [ not-simples>> ] [ or>> ] tri
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  |     3append and-class boa
 | 
					
						
							|  |  |  |     '[ [ class>> _ class-member? ] filter ] change-not-integers ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : answer-ors ( partition -- partition' )
 | 
					
						
							| 
									
										
										
										
											2009-03-18 17:09:45 -04:00
										 |  |  |     dup [ not-integers>> ] [ not-simples>> ] [ simples>> ] tri 3append
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  |     '[ [ _ [ t substitute ] each ] map ] change-or ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : contradiction? ( partition -- ? )
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-03-18 17:09:45 -04:00
										 |  |  |         [ [ simples>> ] [ not-simples>> ] bi intersects? ] | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  |         [ other>> f swap member? ] | 
					
						
							|  |  |  |     } 1|| ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : make-and-class ( partition -- and-class )
 | 
					
						
							|  |  |  |     answer-ors repartition | 
					
						
							|  |  |  |     [ t swap remove ] change-other | 
					
						
							|  |  |  |     dup contradiction? | 
					
						
							|  |  |  |     [ drop f ] | 
					
						
							|  |  |  |     [ filter-not-integers class-partition>seq prune t and-class seq>instance ] if ;
 | 
					
						
							| 
									
										
										
										
											2009-02-19 19:28:54 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-21 13:09:41 -05:00
										 |  |  | : <and-class> ( seq -- class )
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  |     dup and-class flatten partition-classes | 
					
						
							|  |  |  |     dup integers>> length { | 
					
						
							|  |  |  |         { 0 [ nip make-and-class ] } | 
					
						
							|  |  |  |         { 1 [ integers>> first [ '[ _ swap class-member? ] all? ] keep and ] } | 
					
						
							|  |  |  |         [ 3drop f ] | 
					
						
							|  |  |  |     } case ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : filter-integers ( partition -- partition' )
 | 
					
						
							|  |  |  |     dup
 | 
					
						
							| 
									
										
										
										
											2009-03-18 17:09:45 -04:00
										 |  |  |     [ simples>> ] [ not-simples>> ] [ and>> ] tri
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  |     3append or-class boa
 | 
					
						
							|  |  |  |     '[ [ _ class-member? not ] filter ] change-integers ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : answer-ands ( partition -- partition' )
 | 
					
						
							| 
									
										
										
										
											2009-03-18 17:09:45 -04:00
										 |  |  |     dup [ integers>> ] [ not-simples>> ] [ simples>> ] tri 3append
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  |     '[ [ _ [ f substitute ] each ] map ] change-and ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : tautology? ( partition -- ? )
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-03-18 17:09:45 -04:00
										 |  |  |         [ [ simples>> ] [ not-simples>> ] bi intersects? ] | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  |         [ other>> t swap member? ] | 
					
						
							|  |  |  |     } 1|| ;
 | 
					
						
							| 
									
										
										
										
											2009-02-21 13:09:41 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  | : make-or-class ( partition -- and-class )
 | 
					
						
							|  |  |  |     answer-ands repartition | 
					
						
							|  |  |  |     [ f swap remove ] change-other | 
					
						
							|  |  |  |     dup tautology? | 
					
						
							|  |  |  |     [ drop t ] | 
					
						
							|  |  |  |     [ filter-integers class-partition>seq prune f or-class seq>instance ] if ;
 | 
					
						
							| 
									
										
										
										
											2009-02-21 13:09:41 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : <or-class> ( seq -- class )
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  |     dup or-class flatten partition-classes | 
					
						
							|  |  |  |     dup not-integers>> length { | 
					
						
							|  |  |  |         { 0 [ nip make-or-class ] } | 
					
						
							| 
									
										
										
										
											2009-03-21 03:53:36 -04:00
										 |  |  |         { 1 [ | 
					
						
							|  |  |  |             not-integers>> first
 | 
					
						
							|  |  |  |             [ class>> '[ _ swap class-member? ] any? ] keep or
 | 
					
						
							|  |  |  |         ] } | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  |         [ 3drop t ] | 
					
						
							|  |  |  |     } case ;
 | 
					
						
							| 
									
										
										
										
											2009-02-19 17:48:46 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-03 20:22:53 -05:00
										 |  |  | GENERIC: <not-class> ( class -- inverse )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: object <not-class> | 
					
						
							|  |  |  |     not-class boa ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: not-class <not-class> | 
					
						
							|  |  |  |     class>> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: and-class <not-class> | 
					
						
							|  |  |  |     seq>> [ <not-class> ] map <or-class> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: or-class <not-class> | 
					
						
							|  |  |  |     seq>> [ <not-class> ] map <and-class> ;
 | 
					
						
							| 
									
										
										
										
											2009-02-21 13:09:41 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-04 16:54:56 -05:00
										 |  |  | M: t <not-class> drop f ;
 | 
					
						
							|  |  |  | M: f <not-class> drop t ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-21 03:53:36 -04:00
										 |  |  | : <minus-class> ( a b -- a-b )
 | 
					
						
							|  |  |  |     <not-class> 2array <and-class> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <sym-diff-class> ( a b -- a~b )
 | 
					
						
							|  |  |  |     2array [ <or-class> ] [ <and-class> ] bi <minus-class> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-19 19:28:54 -05:00
										 |  |  | M: primitive-class class-member? | 
					
						
							|  |  |  |     class>> class-member? ;
 | 
					
						
							| 
									
										
										
										
											2009-02-20 18:54:48 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-04 14:22:22 -05:00
										 |  |  | TUPLE: condition question yes no ;
 | 
					
						
							|  |  |  | C: <condition> condition | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-09 16:44:11 -04:00
										 |  |  | GENERIC# answer 2 ( class from to -- new-class )
 | 
					
						
							| 
									
										
										
										
											2009-03-04 14:22:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-09 16:44:11 -04:00
										 |  |  | M:: object answer ( class from to -- new-class )
 | 
					
						
							| 
									
										
										
										
											2009-03-04 14:22:22 -05:00
										 |  |  |     class from = to class ? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : replace-compound ( class from to -- seq )
 | 
					
						
							| 
									
										
										
										
											2009-03-09 16:44:11 -04:00
										 |  |  |     [ seq>> ] 2dip '[ _ _ answer ] map ;
 | 
					
						
							| 
									
										
										
										
											2009-03-04 14:22:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-09 16:44:11 -04:00
										 |  |  | M: and-class answer | 
					
						
							| 
									
										
										
										
											2009-03-04 14:22:22 -05:00
										 |  |  |     replace-compound <and-class> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-09 16:44:11 -04:00
										 |  |  | M: or-class answer | 
					
						
							| 
									
										
										
										
											2009-03-04 14:22:22 -05:00
										 |  |  |     replace-compound <or-class> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-09 16:44:11 -04:00
										 |  |  | M: not-class answer | 
					
						
							|  |  |  |     [ class>> ] 2dip answer <not-class> ;
 | 
					
						
							| 
									
										
										
										
											2009-03-04 14:22:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  | GENERIC# substitute 1 ( class from to -- new-class )
 | 
					
						
							|  |  |  | M: object substitute answer ;
 | 
					
						
							|  |  |  | M: not-class substitute [ <not-class> ] bi@ answer ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-09 16:44:11 -04:00
										 |  |  | : assoc-answer ( table question answer -- new-table )
 | 
					
						
							| 
									
										
										
										
											2009-03-11 20:39:35 -04:00
										 |  |  |     '[ _ _ substitute ] assoc-map
 | 
					
						
							| 
									
										
										
										
											2009-03-04 16:54:56 -05:00
										 |  |  |     [ nip ] assoc-filter ;
 | 
					
						
							| 
									
										
										
										
											2009-03-04 14:22:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-09 16:44:11 -04:00
										 |  |  | : assoc-answers ( table questions answer -- new-table )
 | 
					
						
							|  |  |  |     '[ _ assoc-answer ] each ;
 | 
					
						
							| 
									
										
										
										
											2009-03-07 17:31:46 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-04 14:22:22 -05:00
										 |  |  | DEFER: make-condition | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (make-condition) ( table questions question -- condition )
 | 
					
						
							|  |  |  |     [ 2nip ] | 
					
						
							| 
									
										
										
										
											2009-03-09 16:44:11 -04:00
										 |  |  |     [ swap [ t assoc-answer ] dip make-condition ] | 
					
						
							|  |  |  |     [ swap [ f assoc-answer ] dip make-condition ] 3tri
 | 
					
						
							| 
									
										
										
										
											2009-03-04 14:22:22 -05:00
										 |  |  |     2dup = [ 2nip ] [ <condition> ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : make-condition ( table questions -- condition )
 | 
					
						
							| 
									
										
										
										
											2009-03-04 16:54:56 -05:00
										 |  |  |     [ keys ] [ unclip (make-condition) ] if-empty ;
 | 
					
						
							| 
									
										
										
										
											2009-03-04 14:22:22 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | GENERIC: class>questions ( class -- questions )
 | 
					
						
							|  |  |  | : compound-questions ( class -- questions ) seq>> [ class>questions ] gather ;
 | 
					
						
							|  |  |  | M: or-class class>questions compound-questions ;
 | 
					
						
							|  |  |  | M: and-class class>questions compound-questions ;
 | 
					
						
							|  |  |  | M: not-class class>questions class>> class>questions ;
 | 
					
						
							|  |  |  | M: object class>questions 1array ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : table>questions ( table -- questions )
 | 
					
						
							| 
									
										
										
										
											2009-03-05 17:34:04 -05:00
										 |  |  |     values [ class>questions ] gather >array t swap remove ;
 | 
					
						
							| 
									
										
										
										
											2009-03-04 14:22:22 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : table>condition ( table -- condition )
 | 
					
						
							| 
									
										
										
										
											2009-03-04 16:54:56 -05:00
										 |  |  |     ! input table is state => class | 
					
						
							| 
									
										
										
										
											2009-03-04 14:22:22 -05:00
										 |  |  |     >alist dup table>questions make-condition ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : condition-map ( condition quot: ( obj -- obj' ) -- new-condition )  | 
					
						
							|  |  |  |     over condition? [ | 
					
						
							|  |  |  |         [ [ question>> ] [ yes>> ] [ no>> ] tri ] dip
 | 
					
						
							|  |  |  |         '[ _ condition-map ] bi@ <condition>
 | 
					
						
							|  |  |  |     ] [ call ] if ; inline recursive
 | 
					
						
							| 
									
										
										
										
											2009-03-05 17:34:04 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : condition-states ( condition -- states )
 | 
					
						
							|  |  |  |     dup condition? [ | 
					
						
							|  |  |  |         [ yes>> ] [ no>> ] bi
 | 
					
						
							|  |  |  |         [ condition-states ] bi@ append prune | 
					
						
							|  |  |  |     ] [ 1array ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : condition-at ( condition assoc -- new-condition )
 | 
					
						
							|  |  |  |     '[ _ at ] condition-map ;
 |