src/Pure/more_unify.ML
author wenzelm
Fri, 26 Apr 2024 13:25:44 +0200
changeset 80150 96f60533ec1d
parent 79434 6f2c3e4c97d7
permissions -rw-r--r--
update Windows test machines;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59026
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/more_unify.ML
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
     3
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
     4
Add-ons to Higher-Order Unification, outside the inference kernel.
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
     5
*)
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
     6
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
     7
signature UNIFY =
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
     8
sig
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
     9
  include UNIFY
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    10
  val matchers: Context.generic -> (term * term) list -> Envir.env Seq.seq
76062
f1d758690222 tuned signature;
wenzelm
parents: 74280
diff changeset
    11
  val matcher: Context.generic -> term list -> term list -> Envir.env option
59026
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    12
end;
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    13
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    14
structure Unify: UNIFY =
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    15
struct
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    16
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    17
(*Pattern matching*)
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    18
fun first_order_matchers thy pairs (Envir.Envir {maxidx, tenv, tyenv}) =
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    19
  let val (tyenv', tenv') = fold (Pattern.first_order_match thy) pairs (tyenv, tenv)
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    20
  in Seq.single (Envir.Envir {maxidx = maxidx, tenv = tenv', tyenv = tyenv'}) end
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    21
  handle Pattern.MATCH => Seq.empty;
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    22
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    23
(*General matching -- keep variables disjoint*)
63615
wenzelm
parents: 59787
diff changeset
    24
fun matchers _ [] = Seq.single Envir.init
59026
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    25
  | matchers context pairs =
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    26
      let
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    27
        val thy = Context.theory_of context;
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    28
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    29
        val maxidx = fold (Term.maxidx_term o #2) pairs ~1;
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    30
        val offset = maxidx + 1;
79232
99bc2dd45111 more general Logic.incr_indexes_operation;
wenzelm
parents: 76062
diff changeset
    31
        val pairs' = map (apfst (Logic.incr_indexes ([], offset))) pairs;
59026
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    32
        val maxidx' = fold (fn (t, u) => Term.maxidx_term t #> Term.maxidx_term u) pairs' ~1;
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    33
74280
7466b17b0820 more scalable operations;
wenzelm
parents: 63615
diff changeset
    34
        val pat_tvars = TVars.build (fold (TVars.add_tvars o #1) pairs');
7466b17b0820 more scalable operations;
wenzelm
parents: 63615
diff changeset
    35
        val pat_vars = Vars.build (fold (Vars.add_vars o #1) pairs');
59026
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    36
79434
6f2c3e4c97d7 minor performance tuning;
wenzelm
parents: 79232
diff changeset
    37
        val decr_indexesT_same =
6f2c3e4c97d7 minor performance tuning;
wenzelm
parents: 79232
diff changeset
    38
          Term.map_atyps_same
6f2c3e4c97d7 minor performance tuning;
wenzelm
parents: 79232
diff changeset
    39
            (fn TVar ((x, i), S) =>
6f2c3e4c97d7 minor performance tuning;
wenzelm
parents: 79232
diff changeset
    40
                if i > maxidx then TVar ((x, i - offset), S) else raise Same.SAME
6f2c3e4c97d7 minor performance tuning;
wenzelm
parents: 79232
diff changeset
    41
              | _ => raise Same.SAME);
6f2c3e4c97d7 minor performance tuning;
wenzelm
parents: 79232
diff changeset
    42
        val decr_indexesT = Same.commit decr_indexesT_same;
59026
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    43
        val decr_indexes =
79434
6f2c3e4c97d7 minor performance tuning;
wenzelm
parents: 79232
diff changeset
    44
          Term.map_types decr_indexesT_same #>
6f2c3e4c97d7 minor performance tuning;
wenzelm
parents: 79232
diff changeset
    45
          Term.map_aterms
6f2c3e4c97d7 minor performance tuning;
wenzelm
parents: 79232
diff changeset
    46
            (fn Var ((x, i), T) =>
6f2c3e4c97d7 minor performance tuning;
wenzelm
parents: 79232
diff changeset
    47
                if i > maxidx then Var ((x, i - offset), T) else raise Same.SAME
6f2c3e4c97d7 minor performance tuning;
wenzelm
parents: 79232
diff changeset
    48
              | _ => raise Same.SAME);
59026
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    49
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    50
        fun norm_tvar env ((x, i), S) =
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    51
          let
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    52
            val tyenv = Envir.type_env env;
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    53
            val T' = Envir.norm_type tyenv (TVar ((x, i), S));
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    54
          in
74280
7466b17b0820 more scalable operations;
wenzelm
parents: 63615
diff changeset
    55
            if (case T' of TVar (v, _) => v = (x, i) | _ => false) then I
7466b17b0820 more scalable operations;
wenzelm
parents: 63615
diff changeset
    56
            else Vartab.update ((x, i - offset), (S, decr_indexesT T'))
59026
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    57
          end;
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    58
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    59
        fun norm_var env ((x, i), T) =
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    60
          let
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    61
            val tyenv = Envir.type_env env;
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    62
            val T' = Envir.norm_type tyenv T;
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    63
            val t' = Envir.norm_term env (Var ((x, i), T'));
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    64
          in
74280
7466b17b0820 more scalable operations;
wenzelm
parents: 63615
diff changeset
    65
            if (case t' of Var (v, _) => v = (x, i) | _ => false) then I
7466b17b0820 more scalable operations;
wenzelm
parents: 63615
diff changeset
    66
            else Vartab.update ((x, i - offset), (decr_indexesT T', decr_indexes t'))
59026
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    67
          end;
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    68
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    69
        fun result env =
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    70
          if Envir.above env maxidx then   (* FIXME proper handling of generated vars!? *)
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    71
            SOME (Envir.Envir {maxidx = maxidx,
74280
7466b17b0820 more scalable operations;
wenzelm
parents: 63615
diff changeset
    72
              tyenv = Vartab.build (TVars.fold (norm_tvar env o #1) pat_tvars),
7466b17b0820 more scalable operations;
wenzelm
parents: 63615
diff changeset
    73
              tenv = Vartab.build (Vars.fold (norm_var env o #1) pat_vars)})
59026
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    74
          else NONE;
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    75
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    76
        val empty = Envir.empty maxidx';
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    77
      in
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    78
        Seq.append
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    79
          (Seq.map_filter result (Unify.smash_unifiers context pairs' empty))
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    80
          (first_order_matchers thy pairs empty)
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    81
      end;
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    82
76062
f1d758690222 tuned signature;
wenzelm
parents: 74280
diff changeset
    83
fun matcher context ps os =
f1d758690222 tuned signature;
wenzelm
parents: 74280
diff changeset
    84
  if length ps <> length os then NONE
f1d758690222 tuned signature;
wenzelm
parents: 74280
diff changeset
    85
  else Seq.pull (matchers context (ps ~~ os)) |> Option.map #1;
59026
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    86
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    87
open Unify;
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    88
30b8a5825a9c removed some add-ons from modules that are relevant for the inference kernel;
wenzelm
parents:
diff changeset
    89
end;