]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/tactics/continuationals.ml
implemented tinycals:
[helm.git] / helm / software / components / tactics / continuationals.ml
index 3ed167a71c3f7ab471d95c6c13027fac3f519ce1..7ea357e89679694087ce106e890559b4e028d686 100644 (file)
@@ -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))
@@ -270,7 +273,13 @@ struct
       match cmd, stack with
       | _, [] -> assert false
       | Tactical tac, (g, t, k, tag) :: s ->
-          if g = [] then fail (lazy "can't apply a tactic to zero goals");
+(* COMMENTED OUT TO ALLOW PARAMODULATION TO DO A 
+ *   auto paramodulation.try assumption.
+ * EVEN IF NO GOALS ARE LEFT OPEN BY AUTO.
+  
+  if g = [] then fail (lazy "can't apply a tactic to zero goals");
+  
+*)
           debug_print (lazy ("context length " ^string_of_int (List.length g)));
           let rec aux s go gc =
             function
@@ -321,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")