| 
									
										
										
										
											2008-07-30 08:35:58 -04:00
										 |  |  |  | ! Copyright (C) 2008 Slava Pestov. | 
					
						
							|  |  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							|  |  |  |  | USING: accessors arrays classes kernel sequences sets | 
					
						
							| 
									
										
										
										
											2008-12-17 19:10:01 -05:00
										 |  |  |  | io prettyprint multi-methods ;
 | 
					
						
							| 
									
										
										
										
											2008-07-30 08:35:58 -04:00
										 |  |  |  | IN: boolean-expr | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ! Demonstrates the use of Unicode symbols in source files, and | 
					
						
							|  |  |  |  | ! multi-method dispatch. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | TUPLE: ⋀ x y ;
 | 
					
						
							|  |  |  |  | TUPLE: ⋁ x y ;
 | 
					
						
							|  |  |  |  | TUPLE: ¬ x ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-30 11:23:21 -04:00
										 |  |  |  | SINGLETONS: ⊤ ⊥ ;
 | 
					
						
							| 
									
										
										
										
											2008-07-30 08:35:58 -04:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | SINGLETONS: P Q R S T U V W X Y Z ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | UNION: □ ⋀ ⋁ ¬ ⊤ ⊥ P Q R S T U V W X Y Z ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | GENERIC: ⋀ ( x y -- expr )
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | METHOD: ⋀ { ⊤ □ } nip ;
 | 
					
						
							|  |  |  |  | METHOD: ⋀ { □ ⊤ } drop ;
 | 
					
						
							|  |  |  |  | METHOD: ⋀ { ⊥ □ } drop ;
 | 
					
						
							|  |  |  |  | METHOD: ⋀ { □ ⊥ } nip ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | METHOD: ⋀ { ⋁ □ } [ [ x>> ] dip ⋀ ] [ [ y>> ] dip ⋀ ] 2bi ⋁ ;
 | 
					
						
							|  |  |  |  | METHOD: ⋀ { □ ⋁ } [ x>> ⋀ ] [ y>> ⋀ ] 2bi ⋁ ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | METHOD: ⋀ { □ □ } \ ⋀ boa ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | GENERIC: ⋁ ( x y -- expr )
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | METHOD: ⋁ { ⊤ □ } drop ;
 | 
					
						
							|  |  |  |  | METHOD: ⋁ { □ ⊤ } nip ;
 | 
					
						
							|  |  |  |  | METHOD: ⋁ { ⊥ □ } nip ;
 | 
					
						
							|  |  |  |  | METHOD: ⋁ { □ ⊥ } drop ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | METHOD: ⋁ { □ □ } \ ⋁ boa ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | GENERIC: ¬ ( x -- expr )
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | METHOD: ¬ { ⊤ } drop ⊥ ;
 | 
					
						
							|  |  |  |  | METHOD: ¬ { ⊥ } drop ⊤ ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | METHOD: ¬ { ⋀ } [ x>> ¬ ] [ y>> ¬ ] bi ⋁ ;
 | 
					
						
							|  |  |  |  | METHOD: ¬ { ⋁ } [ x>> ¬ ] [ y>> ¬ ] bi ⋀ ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | METHOD: ¬ { □ } \ ¬ boa ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | : → ( x y -- expr ) ¬ ⋀ ;
 | 
					
						
							|  |  |  |  | : ⊕ ( x y -- expr ) [ ⋁ ] [ ⋀ ¬ ] 2bi ⋀ ;
 | 
					
						
							|  |  |  |  | : ≣ ( x y -- expr ) [ ⋀ ] [ [ ¬ ] bi@ ⋀ ] 2bi ⋁ ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | GENERIC: (cnf) ( expr -- cnf )
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | METHOD: (cnf) { ⋀ } [ x>> (cnf) ] [ y>> (cnf) ] bi append ;
 | 
					
						
							|  |  |  |  | METHOD: (cnf) { □ } 1array ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | GENERIC: cnf ( expr -- cnf )
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | METHOD: cnf { ⋁ } [ x>> cnf ] [ y>> cnf ] bi append ;
 | 
					
						
							|  |  |  |  | METHOD: cnf { □ } (cnf) 1array ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | GENERIC: satisfiable? ( expr -- ? )
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | METHOD: satisfiable? { ⊤ } drop t ;
 | 
					
						
							|  |  |  |  | METHOD: satisfiable? { ⊥ } drop f ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | : partition ( seq quot -- left right )
 | 
					
						
							|  |  |  |  |     [ [ not ] compose filter ] [ filter ] 2bi ; inline
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | : (satisfiable?) ( seq -- ? )
 | 
					
						
							|  |  |  |  |     [ \ ¬ instance? ] partition [ x>> ] map intersect empty? ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | METHOD: satisfiable? { □ } | 
					
						
							| 
									
										
										
										
											2009-01-29 23:19:07 -05:00
										 |  |  |  |     cnf [ (satisfiable?) ] any? ;
 | 
					
						
							| 
									
										
										
										
											2008-07-30 08:35:58 -04:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | GENERIC: (expr.) ( expr -- )
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | METHOD: (expr.) { □ } pprint ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | : op. ( expr -- )
 | 
					
						
							|  |  |  |  |     "(" write
 | 
					
						
							|  |  |  |  |     [ x>> (expr.) ] | 
					
						
							|  |  |  |  |     [ bl class pprint bl ] | 
					
						
							|  |  |  |  |     [ y>> (expr.) ] | 
					
						
							|  |  |  |  |     tri
 | 
					
						
							|  |  |  |  |     ")" write ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | METHOD: (expr.) { ⋀ } op. ;
 | 
					
						
							|  |  |  |  | METHOD: (expr.) { ⋁ } op. ;
 | 
					
						
							|  |  |  |  | METHOD: (expr.) { ¬ } [ class pprint ] [ x>> (expr.) ] bi ;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | : expr. ( expr -- ) (expr.) nl ;
 |