44 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			44 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								! Copyright (c) 2012 Anonymous
							 | 
						||
| 
								 | 
							
								! See http://factorcode.org/license.txt for BSD license.
							 | 
						||
| 
								 | 
							
								USING: backtrack continuations kernel prettyprint sequences ;
							 | 
						||
| 
								 | 
							
								IN: rosetta-code.amb
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! http://rosettacode.org/wiki/Amb
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! Define and give an example of the Amb operator.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! The Amb operator takes some number of expressions (or values
							 | 
						||
| 
								 | 
							
								! if that's simpler in the language) and nondeterministically
							 | 
						||
| 
								 | 
							
								! yields the one or fails if given no parameter, amb returns the
							 | 
						||
| 
								 | 
							
								! value that doesn't lead to failure.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! The example is using amb to choose four words from the following strings:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! set 1: "the" "that" "a"
							 | 
						||
| 
								 | 
							
								! set 2: "frog" "elephant" "thing"
							 | 
						||
| 
								 | 
							
								! set 3: "walked" "treaded" "grows"
							 | 
						||
| 
								 | 
							
								! set 4: "slowly" "quickly"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! It is a failure if the last character of word 1 is not equal
							 | 
						||
| 
								 | 
							
								! to the first character of word 2, and similarly with word 2 and
							 | 
						||
| 
								 | 
							
								! word 3, as well as word 3 and word 4. (the only successful
							 | 
						||
| 
								 | 
							
								! sentence is "that thing grows slowly").
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CONSTANT: words {
							 | 
						||
| 
								 | 
							
								    { "the" "that" "a" }
							 | 
						||
| 
								 | 
							
								    { "frog" "elephant" "thing" }
							 | 
						||
| 
								 | 
							
								    { "walked" "treaded" "grows" }
							 | 
						||
| 
								 | 
							
								    { "slowly" "quickly"  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: letters-match? ( str1 str2 -- ? ) [ last ] [ first ] bi* = ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: sentence-match? ( seq -- ? ) dup rest [ letters-match? ] 2all? ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: select ( seq -- seq' ) [ amb-lazy ] map ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: search ( -- )
							 | 
						||
| 
								 | 
							
								    words select dup sentence-match? [ " " join ] [ fail ] if . ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								MAIN: search
							 |