Next: amb examples coloring, Previous: amb examples simple, Up: amb examples [Index]
Given the seed numbers:
1 3
let’s say we want to select the one having the square among:
5 9 11
and the cube among:
13 27 31
we can imagine a search tree, amb examples ssc.
| A | | B | | C | o----- 1 ----- 5 ----- 13 | | |-- 27 | | -- 31 | | | |-- 9 ----- 13 | | |-- 27 | | -- 31 | | | -- 11 ----- 13 | |-- 27 | -- 31 | -- 3 ----- 5 ----- 13 | |-- 27 | -- 31 | |-- 9 ----- 13 | |-- 27 | -- 31 | -- 11 ----- 13 |-- 27 -- 31
If we assign a selected seed to the variable A, a selected possible square to the variable B and a selected possible cube to the variable C, we want search for a tuple (A, B, C) satisfying the constraints: A^2 = B, A^3 = C.
To select among the seeds we use the syntax:
(amb 1 3)
to select among the possible squares we use the syntax:
(amb 5 9 11)
to select among the possible cubes we use the syntax:
(amb 13 27 31)
and the constraints can be expressed by the predicates:
(= (square A) B) (= (cube A) C)
the resulting program follows:
#!r6rs (import (vicare) (vicare language-extensions amb)) (with-ambiguous-choices (let* ((A (amb 1 3)) (B (amb 5 9 11))) (amb-assert (= (square A) B)) (let ((C (amb 13 27 31))) (amb-assert (= (cube A) C)) (list A B C)))) ⇒ (3 9 27)
We can modify the program to show the search path:
#!r6rs (import (vicare) (vicare language-extensions amb)) (define (print . args) (apply fprintf (current-error-port) args)) (with-ambiguous-choices (let ((A (amb 1 3))) (print "A=~a\n" A) (let ((B (amb 5 9 11))) (print "\tB=~a\n" B) (amb-assert (= (square A) B)) (let ((C (amb 13 27 31))) (print "\t\tC=~a\n" C) (amb-assert (= (cube A) C)) (list A B C))))) ⇒ (3 9 27) -| A=1 -| B=5 -| B=9 -| B=11 -| A=3 -| B=5 -| B=9 -| C=13 -| C=27
Next: amb examples coloring, Previous: amb examples simple, Up: amb examples [Index]