On 09/05/2010 07:59 AM, Philippe Sigaud wrote:
On Sun, Sep 5, 2010 at 12:00, Simen kjaeraas <simen.kja...@gmail.com <mailto:simen.kja...@gmail.com>> wrote: Philippe Sigaud <philippe.sig...@gmail.com <mailto:philippe.sig...@gmail.com>> wrote: I guess the D syntax would be auto x = amb([1,2,3]); auto y =amb([4,5,6]); x*y == 8; // forces desambiguation => the ambs explore the possibilities. assert(x == amb([2])); assert(y == amb([4])); There is only one value left, no more ambiguity. But what happens in the case where there is more than one value left? If I understand correctly the linked Ruby and Haskell versions, the search stops as soon as you find a possibility. But then, I'm no pro on this. That's one of the reasons I feel that doing the combination, then filtering it, is more correct. There is also the fact that the above syntax does not let you call arbitrary functions in the requirements, something filter does. The combining and filtering is interesting (in this case, it'd be like doing a list comprehension). But the real challenge in the SO question is the 'going back in time' part, which I have trouble to understand : how can you modify x and y through a multiplication and a comparison? I did a range comprehension maybe one year ago, which would be partially equivalent to the problem: auto solution = comp!("[a,b]", "a*b == 8")([1,2,3], [4,5,6]); solution is a range, in this case a one element range, containing only [2,4].
Here we need to have a crossProduct range, as we discussed in the thread "Combining infinite ranges". Then it's easy to combine it with filter:
auto solutions = filter!"a*b == 8"(crossProduct([1,2,3], [4,5,6])); Andrei