[racket] handy trick for "amb-collect" desired

From: Stefan Busch (stefan_busch_ at arcor.de)
Date: Tue Sep 14 12:45:43 EDT 2010

Hello,

at compile-time.

Stefan



Am 14.09.2010 18:42, schrieb Deren Dohoda:

> Stefan,
>
> Are you trying to pass a run-time list to amb? Or just
> (amb (list 1 2 3 ...)) at compile-time?
>
> Deren
>
> On Tue, Sep 14, 2010 at 12:10 PM, Stefan Busch<stefan_busch_ at arcor.de>  wrote:
>    
>> Hello,
>>
>> of course I have to use  amb-collect.
>>
>> Maybe I didnt describe my problem properly.
>>
>> My intention is to pass the arguments to choose from in a list.
>>
>> The teaching material I got from university gives the following exanple for
>> the usage
>> of amb-collect:
>>
>> ***************************************************************************************
>>
>> ;;get all pairs of values von a and b,
>> ;;which have sum 7
>>
>> (amb-collect)
>> ( let ( ( a (amb 1 2 3 4 5 6 7 ) )
>>           (b (amb 2 4 6 8 ) ) )
>> ( amb-assert (= (+ a b) 7 ) )
>> ( cons a b ) ) )
>>
>>
>> -------->( ( 1 . 6) (3 . 4) (5 . 2 ) )
>>
>> ***************************************************************************************
>>
>> I'm looking for a way to use two lists instead to provide these values: (1 2
>> 3 4 5 6 7) and (2 4 6 8)
>>
>>
>> Thanks,
>> Stefan
>>
>>
>>
>>
>> Am 14.09.2010 17:50, schrieb Thomas Chust:
>>      
>>> 2010/9/14 Stefan Busch<stefan_busch_ at arcor.de>:
>>>
>>>        
>>>> [...]
>>>> Your solution looked convincing to me,
>>>> but when I try e.g.
>>>>
>>>> (amb list (list 1 2 3 4))
>>>>
>>>> it's not evaluated to the desired
>>>>
>>>> 1 2 3 4,
>>>>
>>>> but to
>>>>
>>>> 1.
>>>> [...]
>>>>
>>>>          
>>> Hello,
>>>
>>> I assume you meant to say (amb-list ...) instead of (amb list ...). Of
>>> course
>>> this expression evaluates to the first item in the list. This is the whole
>>> point of amb: To return the result *one* of its arguments evaluates to,
>>> but to
>>> provide the possibility of backtracking and choosing another argument.
>>>
>>> If you want a list of all possible return values of an expression, you
>>> *must*
>>> wrap it in an amb-collect. The implementation of amb provided by
>>> (planet murphy/amb:1:1/amb) will even signal an error if the dynamic
>>> context
>>> of an ambiguous expression is not enclosed by something equivalent to
>>> amb-find
>>> or amb-collect.
>>>
>>> Ciao,
>>> Thomas
>>>
>>>
>>>
>>>        
>> _________________________________________________
>>   For list-related administrative tasks:
>>   http://lists.racket-lang.org/listinfo/users
>>
>>      
>    



Posted on the users mailing list.