X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=components%2Ftactics%2Fcontinuationals.ml;h=eeff9f9bf537783b0e859cfc686cbd0e09aa41b9;hb=679f6296c9a979213425104fa606809d9f1e3bad;hp=4c00fd704f19709dc67b9abb4a098dde46831ddd;hpb=974bd74ea4b4cf56863d25b1fe5c3c50886e8e12;p=helm.git diff --git a/components/tactics/continuationals.ml b/components/tactics/continuationals.ml index 4c00fd704..eeff9f9bf 100644 --- a/components/tactics/continuationals.ml +++ b/components/tactics/continuationals.ml @@ -205,7 +205,8 @@ sig | Branch | Shift - | Pos of int + | Pos of int list + | Wildcard | Merge | Focus of goal list @@ -233,7 +234,8 @@ struct | Semicolon | Branch | Shift - | Pos of int + | Pos of int list + | Wildcard | Merge | Focus of goal list | Unfocus @@ -245,7 +247,8 @@ struct | Semicolon -> "Semicolon" | Branch -> "Branch" | Shift -> "Shift" - | Pos i -> "Pos " ^ string_of_int i + | Pos i -> "Pos " ^ (String.concat "," (List.map string_of_int i)) + | Wildcard -> "Wildcard" | Merge -> "Merge" | Focus gs -> sprintf "Focus [%s]" (String.concat "; " (List.map string_of_int gs)) @@ -299,7 +302,7 @@ struct debug_print (lazy ("closed: " ^ String.concat " " (List.map string_of_int gcn))); let stack = - (zero_pos gon, t @~- gcn, k @~- gon, tag) :: deep_close gcn s + (zero_pos gon, t @~- gcn, k @~- gcn, tag) :: deep_close gcn s in sn, stack | Dot, ([], _, [], _) :: _ -> @@ -327,18 +330,24 @@ struct (([ loc ], t @+ filter_open g, [],`BranchTag) :: (loc_tl, t', k', tag) :: s)) | Shift, _ -> fail (lazy "can't shift goals here") - | Pos i, ([ loc ], [], [],`BranchTag) :: (g', t', k', tag) :: s + | Pos i_s, ([ loc ], [], [],`BranchTag) :: (g', t', k', tag) :: s when is_fresh loc -> - let loc_i, g' = extract_pos i g' in + let l_js = List.filter (fun (i, _) -> List.mem i i_s) g' in new_stack - (([ loc_i ], [], [],`BranchTag) - :: ([ loc ] @+ g', t', k', tag) :: s) - | Pos i, (g, t, k,`BranchTag) :: (g', t', k', tag) :: s -> - let loc_i, g' = extract_pos i g' in + ((l_js, [], [],`BranchTag) + :: ([ loc ] @+ g' @- l_js, t', k', tag) :: s) + | Pos i_s, (g, t, k,`BranchTag) :: (g', t', k', tag) :: s -> + let l_js = List.filter (fun (i, _) -> List.mem i i_s) g' in new_stack - (([ loc_i ], [], [],`BranchTag) - :: (g', t' @+ filter_open g, k', tag) :: s) + ((l_js, [], [],`BranchTag) + :: (g' @- l_js, t' @+ filter_open g, k', tag) :: s) | Pos _, _ -> fail (lazy "can't use relative positioning here") + | Wildcard, (g, t, k, `BranchTag) :: (g', t', k', tag) :: s + when g = [] || is_fresh (List.hd g) -> + new_stack + ((g', [], [], `BranchTag) + :: ([], t' @+ filter_open g @+ k, k', tag) :: s) + | Wildcard, _ -> fail (lazy "can't use wildcard here") | Merge, (g, t, k,`BranchTag) :: (g', t', k', tag) :: s -> new_stack ((t @+ filter_open g @+ g' @+ k, t', k', tag) :: s) | Merge, _ -> fail (lazy "can't merge goals here")