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
|