After a strategy fails, variables that have been bound in matches should be unbound. This is not supported by the current compilation scheme. The following example illustrates the problem. The strategy =f= should behave the same as the choice between =g= and =h=. module unbind-on-backtrack strategies f = (?(x, y); ?(x, x) <+ ?(y, x)); ![y,x] g = ?(x, y); ?(x, x); ![y,x] h = ?(y, x); ![y,x] main = ("a", "b") => ["a", "b"] ; ("a", "b") => ["a", "b"] -- Main.EelcoVisser - 22 Nov 2001
One way: only bind unbound variables when choice is committed: Consider ?F(x, y); s1 <+ s2 and assume that x is bound before invocation of this strategy and that y is not (y value is looked for). transform this into {y: ?F(x, y); s1; split(id,!y)}; ?(_,y); Fst <+ s2 This has the same effect as the earlier expression (can this insight be made more efficient? turned into primitive operations?) Note: this assume one can determine statically which variables are unbound when entering a choice. Although this scheme works when y is bound, it might turn out very expensive, because a failing match to y is discovered after doing s1. -- Main.EelcoVisser - 2000 Solution: Save (the status of) all variables that are bound in the left branch of a choice and restore after failure. Shouldn't be too difficult. -- Main.EelcoVisser - 22 Nov 2001
----- CategoryBugs