| 
									
										
										
										
											2009-02-19 01:11:45 -05:00
										 |  |  | ! Copyright (C) 2009 Daniel Ehrenberg | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							|  |  |  | USING: kernel sequences regexp.transition-tables fry assocs | 
					
						
							| 
									
										
										
										
											2009-02-19 17:48:46 -05:00
										 |  |  | accessors locals math sorting arrays sets hashtables regexp.dfa | 
					
						
							| 
									
										
										
										
											2009-03-04 14:22:22 -05:00
										 |  |  | combinators.short-circuit regexp.classes ;
 | 
					
						
							| 
									
										
										
										
											2010-03-09 13:22:14 -05:00
										 |  |  | FROM: assocs => change-at ;
 | 
					
						
							| 
									
										
										
										
											2009-02-19 01:11:45 -05:00
										 |  |  | IN: regexp.minimize | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-19 17:48:46 -05:00
										 |  |  | : table>state-numbers ( table -- assoc )
 | 
					
						
							|  |  |  |     transitions>> keys <enum> [ swap ] H{ } assoc-map-as ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : number-states ( table -- newtable )
 | 
					
						
							| 
									
										
										
										
											2009-03-05 17:34:04 -05:00
										 |  |  |     dup table>state-numbers transitions-at ;
 | 
					
						
							| 
									
										
										
										
											2009-02-19 17:48:46 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-08 23:34:11 -04:00
										 |  |  | : has-conditions? ( assoc -- ? )
 | 
					
						
							|  |  |  |     values [ condition? ] any? ;
 | 
					
						
							| 
									
										
										
										
											2009-03-04 14:22:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-19 17:48:46 -05:00
										 |  |  | : initially-same? ( s1 s2 transition-table -- ? )
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         [ drop <= ] | 
					
						
							|  |  |  |         [ transitions>> '[ _ at keys ] bi@ set= ] | 
					
						
							| 
									
										
										
										
											2010-03-02 18:05:37 -05:00
										 |  |  |         [ final-states>> '[ _ in? ] bi@ = ] | 
					
						
							| 
									
										
										
										
											2009-02-19 17:48:46 -05:00
										 |  |  |     } 3&& ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-19 01:11:45 -05:00
										 |  |  | :: initialize-partitions ( transition-table -- partitions )
 | 
					
						
							|  |  |  |     ! Partition table is sorted-array => ? | 
					
						
							|  |  |  |     H{ } clone :> out | 
					
						
							| 
									
										
										
										
											2009-03-08 23:34:11 -04:00
										 |  |  |     transition-table transitions>> keys :> states | 
					
						
							| 
									
										
										
										
											2009-02-19 01:11:45 -05:00
										 |  |  |     states [| s1 | | 
					
						
							|  |  |  |         states [| s2 | | 
					
						
							| 
									
										
										
										
											2009-02-19 17:48:46 -05:00
										 |  |  |             s1 s2 transition-table initially-same? | 
					
						
							|  |  |  |             [ s1 s2 2array out conjoin ] when
 | 
					
						
							| 
									
										
										
										
											2009-02-19 01:11:45 -05:00
										 |  |  |         ] each
 | 
					
						
							|  |  |  |     ] each out ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : same-partition? ( s1 s2 partitions -- ? )
 | 
					
						
							| 
									
										
										
										
											2009-03-08 23:34:11 -04:00
										 |  |  |     { [ [ 2array natural-sort ] dip key? ] [ drop = ] } 3|| ;
 | 
					
						
							| 
									
										
										
										
											2009-02-19 01:11:45 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : assemble-values ( assoc1 assoc2 -- values )
 | 
					
						
							|  |  |  |     dup keys '[ _ swap [ at ] curry map ] bi@ zip ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : stay-same? ( s1 s2 transition partitions -- ? )
 | 
					
						
							|  |  |  |     [ '[ _ transitions>> at ] bi@ assemble-values ] dip
 | 
					
						
							|  |  |  |     '[ _ same-partition? ] assoc-all? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : partition-more ( partitions transition-table -- partitions )
 | 
					
						
							|  |  |  |     over '[ drop first2 _ _ stay-same? ] assoc-filter ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : partition>classes ( partitions -- synonyms ) ! old-state => new-state | 
					
						
							|  |  |  |     >alist sort-keys | 
					
						
							|  |  |  |     [ drop first2 swap ] assoc-map
 | 
					
						
							|  |  |  |     <reversed>
 | 
					
						
							|  |  |  |     >hashtable ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-09 13:22:14 -05:00
										 |  |  | :: (while-changes) ( ..a obj quot: ( ..a obj -- ..b obj' ) comp: ( ..b obj' -- ..a key ) old-key -- ..a obj )
 | 
					
						
							| 
									
										
										
										
											2009-03-04 01:36:03 -05:00
										 |  |  |     obj quot call :> new-obj | 
					
						
							|  |  |  |     new-obj comp call :> new-key | 
					
						
							|  |  |  |     new-key old-key =
 | 
					
						
							|  |  |  |     [ new-obj ] | 
					
						
							|  |  |  |     [ new-obj quot comp new-key (while-changes) ] | 
					
						
							|  |  |  |     if ; inline recursive
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : while-changes ( obj quot pred -- obj' )
 | 
					
						
							|  |  |  |     3dup nip call (while-changes) ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-08 23:34:11 -04:00
										 |  |  | : (state-classes) ( transition-table -- partition )
 | 
					
						
							| 
									
										
										
										
											2009-02-19 01:11:45 -05:00
										 |  |  |     [ initialize-partitions ] keep
 | 
					
						
							| 
									
										
										
										
											2009-03-08 23:34:11 -04:00
										 |  |  |     '[ _ partition-more ] [ assoc-size ] while-changes ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : assoc>set ( assoc -- keys-set )
 | 
					
						
							|  |  |  |     [ drop dup ] assoc-map ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : state-classes ( transition-table -- synonyms )
 | 
					
						
							|  |  |  |     clone [ [ nip has-conditions? ] assoc-partition ] change-transitions | 
					
						
							|  |  |  |     [ assoc>set ] [ (state-classes) partition>classes ] bi* assoc-union ;
 | 
					
						
							| 
									
										
										
										
											2009-02-19 01:11:45 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-07 17:31:46 -05:00
										 |  |  | : canonical-state? ( state transitions state-classes -- ? )
 | 
					
						
							| 
									
										
										
										
											2009-03-08 23:34:11 -04:00
										 |  |  |     '[ dup _ at =  ] swap '[ _ at has-conditions? ] bi or ;
 | 
					
						
							| 
									
										
										
										
											2009-02-19 01:11:45 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : delete-duplicates ( transitions state-classes -- new-transitions )
 | 
					
						
							| 
									
										
										
										
											2009-03-07 17:31:46 -05:00
										 |  |  |     dupd '[ drop _ _ canonical-state? ] assoc-filter ;
 | 
					
						
							| 
									
										
										
										
											2009-02-19 01:11:45 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : combine-states ( table -- smaller-table )
 | 
					
						
							|  |  |  |     dup state-classes | 
					
						
							| 
									
										
										
										
											2009-03-05 18:44:29 -05:00
										 |  |  |     [ transitions-at ] keep
 | 
					
						
							|  |  |  |     '[ _ delete-duplicates ] change-transitions ;
 | 
					
						
							| 
									
										
										
										
											2009-02-19 01:11:45 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-07 17:31:46 -05:00
										 |  |  | : combine-state-transitions ( hash -- hash )
 | 
					
						
							| 
									
										
										
										
											2009-11-05 18:03:24 -05:00
										 |  |  |     [ H{ } clone ] dip over '[ | 
					
						
							| 
									
										
										
										
											2009-03-07 17:31:46 -05:00
										 |  |  |         _ [ 2array <or-class> ] change-at
 | 
					
						
							|  |  |  |     ] assoc-each [ swap ] assoc-map ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : combine-transitions ( table -- table )
 | 
					
						
							|  |  |  |     [ [ combine-state-transitions ] assoc-map ] change-transitions ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-19 01:11:45 -05:00
										 |  |  | : minimize ( table -- minimal-table )
 | 
					
						
							| 
									
										
										
										
											2009-03-07 17:31:46 -05:00
										 |  |  |     clone
 | 
					
						
							|  |  |  |     number-states | 
					
						
							| 
									
										
										
										
											2009-03-08 23:34:11 -04:00
										 |  |  |     combine-states | 
					
						
							| 
									
										
										
										
											2009-03-11 23:04:47 -04:00
										 |  |  |     combine-transitions | 
					
						
							|  |  |  |     expand-ors ;
 |