Chris Rathman (9.3.2006 13:29):
I appreciate the help I've gotten and hope not to wear out my welcome, but I'm stuck again. This is probably not the sort of problem for a Oz newbie like myself to tackle, but it's the one in my path at the moment. Not sure I can clearly state the problem, but here goes....

If I have an unbound variable (Z) in the last position of a list like say:

 X|Y|Z

Then the structure of the variable Z in the tail could theoretically be any of the following possibilities along an infinite choice of possibilities:

 A|B|C|Z = _|_|_|nil         %% Z = nil
 A|B|C|Z = _|_|_|_|nil       %% Z = _|nil
 A|B|C|Z = _|_|_|_|_|nil     %% Z = _|_|nil
 ....                        %% Z = _|_|...|nil

And so on. What I'd like is to have a function that generates the possible choices of the infinite variety of structures that are possible when an unbound variable is in the last position of the list. Some example inputs and choice lists follow:

 Example Input: A|B|C|Z
    choice
       A|B|C|nil
    [] A|B|C|_<optimized>|nil
    [] A|B|C|_<optimized>|_<optimized>|nil
    [] A|B|C|_<optimized>|_<optimized>|_<optimized>|nil
       ....
    end

 Another Example Input: 1|Z
    choice
       1|nil
    [] 1|_<optimized>|nil
    [] 1|_<optimized>|_<optimized>|nil
    [] 1|_<optimized>|_<optimized>|_<optimized>|nil
       ....
    end
On the other hand, if the root tail of the list is nil, then the function just needs to return the list as the function value

 Example Input: nil
 Output:   nil
   Example Input: 1|nil
 Output:   1|nil   Example Input: 1|2|nil
 Output:   1|2|nil       and so on....

As a background, this is basically what the Listo function does in mini-Kanren. Unfortunately, all my feeble attempts to build a recursive choice list along these lines results in going into a wait state, as the act of testing the structure seems to bind it at that juncture. What I'd like is something along the lines of:

fun {Listo L} H T in
 if {IsBound L} then
    case L
    of nil then nil
    [] H|T then H|{Listo T}
    end
 else
    choice
       L
    [] L = H|T
       H|{Listo T}
    end
 end
end

But of course this is pseudo code, so it don't get me very far. I'm not aware of a IsBound type function in Oz to test whether I'm at the last position of the list and it's an unbound variable. (And while I'm at it, is there a name for this last position in the list? Base? Root?)

Thanks,
Chris Rathman


Hi,

try this in the OPI:

local
   fun {FindTail L}
      if {IsDet L}==false then
         nil#_
      else
         case L
         of nil then
            nil#nil
         [] H|T then
            H2#T2={FindTail T}
         in
            (H|H2)#T2
         end
      end
   end
   fun {GenerateTail}
      choice
         nil
      []
         _|{GenerateTail}
      end
   end
   fun {GenLists L}
      proc {$ Root}
         H#T={FindTail L}
      in
         if {IsDet T} then
            Root=L
         else
            Root=H|{GenerateTail}
         end
      end
   end
   Solutions
   K
in
   Solutions=thread
                {Search.all {GenLists a|b|c|_} 1 K}
             end
   {Inspect Solutions}
   {Delay 1000}
   {K} %% Kill the search! :-)
end

Why do you need this?

Cheers,
Filip

_________________________________________________________________________________
mozart-users mailing list                               
[email protected]
http://www.mozart-oz.org/mailman/listinfo/mozart-users

Reply via email to