Command to add dependencies, fixed processing of dependencies.
authorballarin
Thu, 27 Nov 2008 10:28:27 +0100
changeset 28894ff724071b902
parent 28893 4e6fd31c9883
child 28895 4e2914c2f8c5
Command to add dependencies, fixed processing of dependencies.
src/Pure/Isar/new_locale.ML
     1.1 --- a/src/Pure/Isar/new_locale.ML	Thu Nov 27 10:26:00 2008 +0100
     1.2 +++ b/src/Pure/Isar/new_locale.ML	Thu Nov 27 10:28:27 2008 +0100
     1.3 @@ -35,6 +35,7 @@
     1.4    val add_type_syntax: string -> declaration -> Proof.context -> Proof.context
     1.5    val add_term_syntax: string -> declaration -> Proof.context -> Proof.context
     1.6    val add_declaration: string -> declaration -> Proof.context -> Proof.context
     1.7 +  val add_dependency: string -> (string * Morphism.morphism) -> Proof.context -> Proof.context
     1.8  
     1.9    (* Activate locales *)
    1.10    val activate_declarations: theory -> string * Morphism.morphism ->
    1.11 @@ -172,28 +173,24 @@
    1.12  
    1.13  val empty = (Idtab.empty : identifiers);
    1.14  
    1.15 -fun roundup thy (deps, marked) =
    1.16 -(* FIXME simplify code: should probably only get one dep as argument *)
    1.17 +fun add thy (name, morph) (deps, marked) =
    1.18    let
    1.19 -    fun add (name, morph) (deps, marked) =
    1.20 +    val Loc {parameters = (_, params), dependencies, ...} = the_locale thy name;
    1.21 +    val instance = params |>
    1.22 +      map ((fn (b, T, _) => Free (Name.name_of b, the T)) #> Morphism.term morph);
    1.23 +  in
    1.24 +    if Idtab.defined marked (name, instance)
    1.25 +    then (deps, marked)
    1.26 +    else
    1.27        let
    1.28 -        val Loc {parameters = (_, params), dependencies, ...} = the_locale thy name;
    1.29 -        val instance = params |>
    1.30 -          map ((fn (b, T, _) => Free (Name.name_of b, the T)) #> Morphism.term morph);
    1.31 +        val dependencies' =
    1.32 +          map (fn ((name, morph'), _) => (name, morph' $>  morph)) dependencies;
    1.33 +        val marked' = Idtab.insert (op =) ((name, instance), ()) marked;
    1.34 +        val (deps', marked'') = fold_rev (add thy) dependencies' ([], marked');
    1.35        in
    1.36 -        if Idtab.defined marked (name, instance)
    1.37 -        then (deps, marked)
    1.38 -        else
    1.39 -          let
    1.40 -            val dependencies' =
    1.41 -              map (fn ((name, morph'), _) => (name, morph' $>  morph)) dependencies;
    1.42 -            val marked' = Idtab.insert (op =) ((name, instance), ()) marked;
    1.43 -            val (deps', marked'') = fold_rev add dependencies' ([], marked');
    1.44 -          in
    1.45 -            (cons (name, morph) deps' @ deps, marked'')
    1.46 -          end
    1.47 +        ((name, morph) :: deps' @ deps, marked'')
    1.48        end
    1.49 -  in fold_rev add deps ([], marked) end;
    1.50 +  end;
    1.51  
    1.52  end;
    1.53  
    1.54 @@ -210,11 +207,9 @@
    1.55    let
    1.56      val name' = intern thy name;
    1.57      val Loc {dependencies, ...} = the_locale thy name';
    1.58 -    val (dependencies', marked) =
    1.59 -      roundup thy ((name', morph) ::
    1.60 -        map (fn ((n, morph'), _) => (n, morph' $> morph)) dependencies, marked);
    1.61 +    val (dependencies', marked') = add thy (name', morph) ([], marked);
    1.62    in
    1.63 -    (marked, ctxt |> fold_rev (activate_decls thy) dependencies')
    1.64 +    (marked', ctxt |> fold_rev (activate_decls thy) dependencies')
    1.65    end;
    1.66  
    1.67  fun activate_notes activ_elem thy (name, morph) input =
    1.68 @@ -232,11 +227,9 @@
    1.69    let
    1.70      val name' = intern thy name;
    1.71      val Loc {dependencies, ...} = the_locale thy name';
    1.72 -    val (dependencies', marked) =
    1.73 -      roundup thy ((name', morph) ::
    1.74 -        map (fn ((n, morph'), _) => (n, morph' $> morph)) dependencies, marked);
    1.75 +    val (dependencies', marked') = add thy (name', morph) ([], marked);
    1.76    in
    1.77 -    (marked, ctxt |> fold_rev (activate_notes activ_elem thy) dependencies')
    1.78 +    (marked', ctxt |> fold_rev (activate_notes activ_elem thy) dependencies')
    1.79    end;
    1.80  
    1.81  fun activate name thy activ_elem input =
    1.82 @@ -244,8 +237,6 @@
    1.83      val name' = intern thy name;
    1.84      val Loc {parameters = (_, params), spec = (asm, defs), dependencies, ...} =
    1.85        the_locale thy name';
    1.86 -    val dependencies' =
    1.87 -      (name', Morphism.identity) :: fst (roundup thy (map fst dependencies, empty));
    1.88    in
    1.89      input |>
    1.90        (if not (null params) then activ_elem (Fixes params) else I) |>
    1.91 @@ -337,5 +328,12 @@
    1.92  
    1.93  end;
    1.94  
    1.95 +(* Dependencies *)
    1.96 +
    1.97 +fun add_dependency loc dep =
    1.98 +  ProofContext.theory (change_locale loc
    1.99 +    (fn (parameters, spec, decls, notes, dependencies) =>
   1.100 +      (parameters, spec, decls, notes, (dep, stamp ()) :: dependencies)));
   1.101 +
   1.102  end;
   1.103