src/Tools/Metis/src/Model.sml
author blanchet
Mon, 13 Sep 2010 21:09:43 +0200
changeset 39348 6f9c9899f99f
child 39349 2d0a4361c3ef
permissions -rw-r--r--
new version of the Metis files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     1
(* ========================================================================= *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     2
(* RANDOM FINITE MODELS                                                      *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     3
(* Copyright (c) 2003 Joe Hurd, distributed under the GNU GPL version 2      *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     4
(* ========================================================================= *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     6
structure Model :> Model =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     7
struct
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     8
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     9
open Useful;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    10
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    11
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    12
(* Constants.                                                                *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    13
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    14
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    15
val maxSpace = 1000;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    16
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    17
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    18
(* Helper functions.                                                         *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    19
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    20
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    21
val multInt =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    22
    case Int.maxInt of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    23
      NONE => (fn x => fn y => SOME (x * y))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    24
    | SOME m =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    25
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    26
        val m = Real.floor (Math.sqrt (Real.fromInt m))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    27
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    28
        fn x => fn y => if x <= m andalso y <= m then SOME (x * y) else NONE
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    29
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    30
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    31
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    32
  fun iexp x y acc =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    33
      if y mod 2 = 0 then iexp' x y acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    34
      else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    35
        case multInt acc x of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    36
          SOME acc => iexp' x y acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    37
        | NONE => NONE
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    38
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    39
  and iexp' x y acc =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    40
      if y = 1 then SOME acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    41
      else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    42
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    43
          val y = y div 2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    44
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    45
          case multInt x x of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    46
            SOME x => iexp x y acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    47
          | NONE => NONE
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    48
        end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    49
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    50
  fun expInt x y =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    51
      if y <= 1 then
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    52
        if y = 0 then SOME 1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    53
        else if y = 1 then SOME x
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    54
        else raise Bug "expInt: negative exponent"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    55
      else if x <= 1 then
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    56
        if 0 <= x then SOME x
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    57
        else raise Bug "expInt: negative exponand"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    58
      else iexp x y 1;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    59
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    60
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    61
fun boolToInt true = 1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    62
  | boolToInt false = 0;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    63
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    64
fun intToBool 1 = true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    65
  | intToBool 0 = false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    66
  | intToBool _ = raise Bug "Model.intToBool";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    67
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    68
fun minMaxInterval i j = interval i (1 + j - i);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    69
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    70
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    71
(* Model size.                                                               *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    72
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    73
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    74
type size = {size : int};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    75
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    76
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    77
(* A model of size N has integer elements 0...N-1.                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    78
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    79
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    80
type element = int;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    81
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    82
val zeroElement = 0;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    83
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    84
fun incrementElement {size = N} i =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    85
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    86
      val i = i + 1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    87
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    88
      if i = N then NONE else SOME i
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    89
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    90
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    91
fun elementListSpace {size = N} arity =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    92
    case expInt N arity of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    93
      NONE => NONE
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    94
    | s as SOME m => if m <= maxSpace then s else NONE;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    95
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    96
fun elementListIndex {size = N} =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    97
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    98
      fun f acc elts =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    99
          case elts of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   100
            [] => acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   101
          | elt :: elts => f (N * acc + elt) elts
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   102
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   103
      f 0
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   104
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   105
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   106
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   107
(* The parts of the model that are fixed.                                    *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   108
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   109
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   110
type fixedFunction = size -> element list -> element option;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   111
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   112
type fixedRelation = size -> element list -> bool option;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   113
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   114
datatype fixed =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   115
    Fixed of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   116
      {functions : fixedFunction NameArityMap.map,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   117
       relations : fixedRelation NameArityMap.map};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   118
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   119
val uselessFixedFunction : fixedFunction = K (K NONE);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   120
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   121
val uselessFixedRelation : fixedRelation = K (K NONE);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   122
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   123
val emptyFunctions : fixedFunction NameArityMap.map = NameArityMap.new ();
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   124
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   125
val emptyRelations : fixedRelation NameArityMap.map = NameArityMap.new ();
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   126
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   127
fun fixed0 f sz elts =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   128
    case elts of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   129
      [] => f sz
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   130
    | _ => raise Bug "Model.fixed0: wrong arity";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   131
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   132
fun fixed1 f sz elts =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   133
    case elts of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   134
      [x] => f sz x
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   135
    | _ => raise Bug "Model.fixed1: wrong arity";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   136
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   137
fun fixed2 f sz elts =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   138
    case elts of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   139
      [x,y] => f sz x y
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   140
    | _ => raise Bug "Model.fixed2: wrong arity";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   141
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   142
val emptyFixed =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   143
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   144
      val fns = emptyFunctions
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   145
      and rels = emptyRelations
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   146
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   147
      Fixed
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   148
        {functions = fns,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   149
         relations = rels}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   150
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   151
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   152
fun peekFunctionFixed fix name_arity =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   153
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   154
      val Fixed {functions = fns, ...} = fix
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   155
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   156
      NameArityMap.peek fns name_arity
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   157
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   158
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   159
fun peekRelationFixed fix name_arity =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   160
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   161
      val Fixed {relations = rels, ...} = fix
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   162
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   163
      NameArityMap.peek rels name_arity
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   164
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   165
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   166
fun getFunctionFixed fix name_arity =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   167
    case peekFunctionFixed fix name_arity of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   168
      SOME f => f
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   169
    | NONE => uselessFixedFunction;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   170
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   171
fun getRelationFixed fix name_arity =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   172
    case peekRelationFixed fix name_arity of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   173
      SOME rel => rel
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   174
    | NONE => uselessFixedRelation;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   175
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   176
fun insertFunctionFixed fix name_arity_fn =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   177
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   178
      val Fixed {functions = fns, relations = rels} = fix
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   179
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   180
      val fns = NameArityMap.insert fns name_arity_fn
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   181
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   182
      Fixed
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   183
        {functions = fns,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   184
         relations = rels}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   185
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   186
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   187
fun insertRelationFixed fix name_arity_rel =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   188
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   189
      val Fixed {functions = fns, relations = rels} = fix
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   190
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   191
      val rels = NameArityMap.insert rels name_arity_rel
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   192
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   193
      Fixed
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   194
        {functions = fns,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   195
         relations = rels}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   196
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   197
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   198
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   199
  fun union _ = raise Bug "Model.unionFixed: nameArity clash";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   200
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   201
  fun unionFixed fix1 fix2 =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   202
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   203
        val Fixed {functions = fns1, relations = rels1} = fix1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   204
        and Fixed {functions = fns2, relations = rels2} = fix2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   205
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   206
        val fns = NameArityMap.union union fns1 fns2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   207
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   208
        val rels = NameArityMap.union union rels1 rels2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   209
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   210
        Fixed
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   211
          {functions = fns,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   212
           relations = rels}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   213
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   214
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   215
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   216
val unionListFixed =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   217
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   218
      fun union (fix,acc) = unionFixed acc fix
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   219
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   220
      List.foldl union emptyFixed
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   221
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   222
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   223
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   224
  fun hasTypeFn _ elts =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   225
      case elts of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   226
        [x,_] => SOME x
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   227
      | _ => raise Bug "Model.hasTypeFn: wrong arity";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   228
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   229
  fun eqRel _ elts =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   230
      case elts of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   231
        [x,y] => SOME (x = y)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   232
      | _ => raise Bug "Model.eqRel: wrong arity";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   233
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   234
  val basicFixed =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   235
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   236
        val fns = NameArityMap.singleton (Term.hasTypeFunction,hasTypeFn)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   237
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   238
        val rels = NameArityMap.singleton (Atom.eqRelation,eqRel)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   239
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   240
        Fixed
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   241
          {functions = fns,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   242
           relations = rels}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   243
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   244
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   245
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   246
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   247
(* Renaming fixed model parts.                                               *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   248
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   249
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   250
type fixedMap =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   251
     {functionMap : Name.name NameArityMap.map,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   252
      relationMap : Name.name NameArityMap.map};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   253
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   254
fun mapFixed fixMap fix =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   255
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   256
      val {functionMap = fnMap, relationMap = relMap} = fixMap
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   257
      and Fixed {functions = fns, relations = rels} = fix
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   258
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   259
      val fns = NameArityMap.compose fnMap fns
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   260
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   261
      val rels = NameArityMap.compose relMap rels
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   262
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   263
      Fixed
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   264
        {functions = fns,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   265
         relations = rels}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   266
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   267
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   268
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   269
  fun mkEntry tag (na,n) = (tag,na,n);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   270
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   271
  fun mkList tag m = map (mkEntry tag) (NameArityMap.toList m);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   272
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   273
  fun ppEntry (tag,source_arity,target) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   274
      Print.blockProgram Print.Inconsistent 2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   275
        [Print.addString tag,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   276
         Print.addBreak 1,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   277
         NameArity.pp source_arity,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   278
         Print.addString " ->",
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   279
         Print.addBreak 1,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   280
         Name.pp target];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   281
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   282
  fun ppFixedMap fixMap =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   283
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   284
        val {functionMap = fnMap, relationMap = relMap} = fixMap
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   285
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   286
        case mkList "function" fnMap @ mkList "relation" relMap of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   287
          [] => Print.skip
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   288
        | entry :: entries =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   289
          Print.blockProgram Print.Consistent 0
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   290
            (ppEntry entry ::
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   291
             map (Print.sequence Print.addNewline o ppEntry) entries)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   292
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   293
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   294
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   295
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   296
(* Standard fixed model parts.                                               *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   297
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   298
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   299
(* Projections *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   300
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   301
val projectionMin = 1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   302
and projectionMax = 9;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   303
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   304
val projectionList = minMaxInterval projectionMin projectionMax;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   305
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   306
fun projectionName i =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   307
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   308
      val _ = projectionMin <= i orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   309
              raise Bug "Model.projectionName: less than projectionMin"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   310
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   311
      val _ = i <= projectionMax orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   312
              raise Bug "Model.projectionName: greater than projectionMax"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   313
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   314
      Name.fromString ("project" ^ Int.toString i)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   315
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   316
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   317
fun projectionFn i _ elts = SOME (List.nth (elts, i - 1));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   318
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   319
fun arityProjectionFixed arity =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   320
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   321
      fun mkProj i = ((projectionName i, arity), projectionFn i)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   322
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   323
      fun addProj i acc =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   324
          if i > arity then acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   325
          else addProj (i + 1) (NameArityMap.insert acc (mkProj i))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   326
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   327
      val fns = addProj projectionMin emptyFunctions
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   328
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   329
      val rels = emptyRelations
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   330
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   331
      Fixed
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   332
        {functions = fns,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   333
         relations = rels}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   334
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   335
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   336
val projectionFixed =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   337
    unionListFixed (map arityProjectionFixed projectionList);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   338
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   339
(* Arithmetic *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   340
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   341
val numeralMin = ~100
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   342
and numeralMax = 100;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   343
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   344
val numeralList = minMaxInterval numeralMin numeralMax;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   345
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   346
fun numeralName i =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   347
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   348
      val _ = numeralMin <= i orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   349
              raise Bug "Model.numeralName: less than numeralMin"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   350
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   351
      val _ = i <= numeralMax orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   352
              raise Bug "Model.numeralName: greater than numeralMax"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   353
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   354
      val s = if i < 0 then "negative" ^ Int.toString (~i) else Int.toString i
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   355
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   356
      Name.fromString s
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   357
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   358
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   359
val addName = Name.fromString "+"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   360
and divName = Name.fromString "div"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   361
and dividesName = Name.fromString "divides"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   362
and evenName = Name.fromString "even"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   363
and expName = Name.fromString "exp"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   364
and geName = Name.fromString ">="
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   365
and gtName = Name.fromString ">"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   366
and isZeroName = Name.fromString "isZero"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   367
and leName = Name.fromString "<="
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   368
and ltName = Name.fromString "<"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   369
and modName = Name.fromString "mod"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   370
and multName = Name.fromString "*"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   371
and negName = Name.fromString "~"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   372
and oddName = Name.fromString "odd"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   373
and preName = Name.fromString "pre"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   374
and subName = Name.fromString "-"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   375
and sucName = Name.fromString "suc";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   376
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   377
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   378
  (* Support *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   379
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   380
  fun modN {size = N} x = x mod N;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   381
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   382
  fun oneN sz = modN sz 1;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   383
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   384
  fun multN sz (x,y) = modN sz (x * y);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   385
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   386
  (* Functions *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   387
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   388
  fun numeralFn i sz = SOME (modN sz i);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   389
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   390
  fun addFn sz x y = SOME (modN sz (x + y));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   391
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   392
  fun divFn {size = N} x y =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   393
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   394
        val y = if y = 0 then N else y
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   395
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   396
        SOME (x div y)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   397
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   398
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   399
  fun expFn sz x y = SOME (exp (multN sz) x y (oneN sz));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   400
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   401
  fun modFn {size = N} x y =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   402
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   403
        val y = if y = 0 then N else y
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   404
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   405
        SOME (x mod y)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   406
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   407
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   408
  fun multFn sz x y = SOME (multN sz (x,y));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   409
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   410
  fun negFn {size = N} x = SOME (if x = 0 then 0 else N - x);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   411
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   412
  fun preFn {size = N} x = SOME (if x = 0 then N - 1 else x - 1);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   413
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   414
  fun subFn {size = N} x y = SOME (if x < y then N + x - y else x - y);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   415
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   416
  fun sucFn {size = N} x = SOME (if x = N - 1 then 0 else x + 1);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   417
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   418
  (* Relations *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   419
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   420
  fun dividesRel _ x y = SOME (divides x y);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   421
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   422
  fun evenRel _ x = SOME (x mod 2 = 0);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   423
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   424
  fun geRel _ x y = SOME (x >= y);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   425
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   426
  fun gtRel _ x y = SOME (x > y);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   427
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   428
  fun isZeroRel _ x = SOME (x = 0);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   429
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   430
  fun leRel _ x y = SOME (x <= y);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   431
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   432
  fun ltRel _ x y = SOME (x < y);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   433
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   434
  fun oddRel _ x = SOME (x mod 2 = 1);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   435
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   436
  val modularFixed =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   437
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   438
        val fns =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   439
            NameArityMap.fromList
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   440
              (map (fn i => ((numeralName i,0), fixed0 (numeralFn i)))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   441
                 numeralList @
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   442
               [((addName,2), fixed2 addFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   443
                ((divName,2), fixed2 divFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   444
                ((expName,2), fixed2 expFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   445
                ((modName,2), fixed2 modFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   446
                ((multName,2), fixed2 multFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   447
                ((negName,1), fixed1 negFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   448
                ((preName,1), fixed1 preFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   449
                ((subName,2), fixed2 subFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   450
                ((sucName,1), fixed1 sucFn)])
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   451
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   452
        val rels =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   453
            NameArityMap.fromList
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   454
              [((dividesName,2), fixed2 dividesRel),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   455
               ((evenName,1), fixed1 evenRel),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   456
               ((geName,2), fixed2 geRel),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   457
               ((gtName,2), fixed2 gtRel),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   458
               ((isZeroName,1), fixed1 isZeroRel),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   459
               ((leName,2), fixed2 leRel),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   460
               ((ltName,2), fixed2 ltRel),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   461
               ((oddName,1), fixed1 oddRel)]
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   462
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   463
        Fixed
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   464
          {functions = fns,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   465
           relations = rels}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   466
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   467
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   468
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   469
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   470
  (* Support *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   471
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   472
  fun cutN {size = N} x = if x >= N then N - 1 else x;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   473
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   474
  fun oneN sz = cutN sz 1;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   475
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   476
  fun multN sz (x,y) = cutN sz (x * y);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   477
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   478
  (* Functions *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   479
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   480
  fun numeralFn i sz = if i < 0 then NONE else SOME (cutN sz i);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   481
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   482
  fun addFn sz x y = SOME (cutN sz (x + y));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   483
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   484
  fun divFn _ x y = if y = 0 then NONE else SOME (x div y);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   485
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   486
  fun expFn sz x y = SOME (exp (multN sz) x y (oneN sz));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   487
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   488
  fun modFn {size = N} x y =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   489
      if y = 0 orelse x = N - 1 then NONE else SOME (x mod y);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   490
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   491
  fun multFn sz x y = SOME (multN sz (x,y));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   492
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   493
  fun negFn _ x = if x = 0 then SOME 0 else NONE;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   494
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   495
  fun preFn _ x = if x = 0 then NONE else SOME (x - 1);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   496
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   497
  fun subFn {size = N} x y =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   498
      if y = 0 then SOME x
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   499
      else if x = N - 1 orelse x < y then NONE
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   500
      else SOME (x - y);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   501
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   502
  fun sucFn sz x = SOME (cutN sz (x + 1));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   503
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   504
  (* Relations *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   505
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   506
  fun dividesRel {size = N} x y =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   507
      if x = 1 orelse y = 0 then SOME true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   508
      else if x = 0 then SOME false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   509
      else if y = N - 1 then NONE
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   510
      else SOME (divides x y);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   511
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   512
  fun evenRel {size = N} x =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   513
      if x = N - 1 then NONE else SOME (x mod 2 = 0);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   514
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   515
  fun geRel {size = N} y x =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   516
      if x = N - 1 then if y = N - 1 then NONE else SOME false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   517
      else if y = N - 1 then SOME true else SOME (x <= y);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   518
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   519
  fun gtRel {size = N} y x =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   520
      if x = N - 1 then if y = N - 1 then NONE else SOME false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   521
      else if y = N - 1 then SOME true else SOME (x < y);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   522
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   523
  fun isZeroRel _ x = SOME (x = 0);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   524
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   525
  fun leRel {size = N} x y =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   526
      if x = N - 1 then if y = N - 1 then NONE else SOME false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   527
      else if y = N - 1 then SOME true else SOME (x <= y);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   528
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   529
  fun ltRel {size = N} x y =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   530
      if x = N - 1 then if y = N - 1 then NONE else SOME false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   531
      else if y = N - 1 then SOME true else SOME (x < y);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   532
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   533
  fun oddRel {size = N} x =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   534
      if x = N - 1 then NONE else SOME (x mod 2 = 1);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   535
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   536
  val overflowFixed =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   537
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   538
        val fns =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   539
            NameArityMap.fromList
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   540
              (map (fn i => ((numeralName i,0), fixed0 (numeralFn i)))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   541
                 numeralList @
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   542
               [((addName,2), fixed2 addFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   543
                ((divName,2), fixed2 divFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   544
                ((expName,2), fixed2 expFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   545
                ((modName,2), fixed2 modFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   546
                ((multName,2), fixed2 multFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   547
                ((negName,1), fixed1 negFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   548
                ((preName,1), fixed1 preFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   549
                ((subName,2), fixed2 subFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   550
                ((sucName,1), fixed1 sucFn)])
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   551
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   552
        val rels =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   553
            NameArityMap.fromList
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   554
              [((dividesName,2), fixed2 dividesRel),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   555
               ((evenName,1), fixed1 evenRel),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   556
               ((geName,2), fixed2 geRel),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   557
               ((gtName,2), fixed2 gtRel),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   558
               ((isZeroName,1), fixed1 isZeroRel),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   559
               ((leName,2), fixed2 leRel),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   560
               ((ltName,2), fixed2 ltRel),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   561
               ((oddName,1), fixed1 oddRel)]
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   562
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   563
        Fixed
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   564
          {functions = fns,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   565
           relations = rels}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   566
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   567
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   568
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   569
(* Sets *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   570
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   571
val cardName = Name.fromString "card"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   572
and complementName = Name.fromString "complement"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   573
and differenceName = Name.fromString "difference"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   574
and emptyName = Name.fromString "empty"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   575
and memberName = Name.fromString "member"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   576
and insertName = Name.fromString "insert"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   577
and intersectName = Name.fromString "intersect"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   578
and singletonName = Name.fromString "singleton"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   579
and subsetName = Name.fromString "subset"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   580
and symmetricDifferenceName = Name.fromString "symmetricDifference"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   581
and unionName = Name.fromString "union"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   582
and universeName = Name.fromString "universe";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   583
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   584
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   585
  (* Support *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   586
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   587
  fun eltN {size = N} =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   588
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   589
        fun f 0 acc = acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   590
          | f x acc = f (x div 2) (acc + 1)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   591
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   592
        f N ~1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   593
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   594
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   595
  fun posN i = Word.<< (0w1, Word.fromInt i);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   596
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   597
  fun univN sz = Word.- (posN (eltN sz), 0w1);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   598
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   599
  fun setN sz x = Word.andb (Word.fromInt x, univN sz);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   600
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   601
  (* Functions *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   602
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   603
  fun cardFn sz x =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   604
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   605
        fun f 0w0 acc = acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   606
          | f s acc =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   607
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   608
              val acc = if Word.andb (s,0w1) = 0w0 then acc else acc + 1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   609
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   610
              f (Word.>> (s,0w1)) acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   611
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   612
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   613
        SOME (f (setN sz x) 0)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   614
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   615
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   616
  fun complementFn sz x = SOME (Word.toInt (Word.xorb (univN sz, setN sz x)));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   617
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   618
  fun differenceFn sz x y =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   619
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   620
        val x = setN sz x
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   621
        and y = setN sz y
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   622
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   623
        SOME (Word.toInt (Word.andb (x, Word.notb y)))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   624
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   625
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   626
  fun emptyFn _ = SOME 0;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   627
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   628
  fun insertFn sz x y =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   629
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   630
        val x = x mod eltN sz
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   631
        and y = setN sz y
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   632
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   633
        SOME (Word.toInt (Word.orb (posN x, y)))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   634
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   635
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   636
  fun intersectFn sz x y =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   637
      SOME (Word.toInt (Word.andb (setN sz x, setN sz y)));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   638
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   639
  fun singletonFn sz x =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   640
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   641
        val x = x mod eltN sz
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   642
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   643
        SOME (Word.toInt (posN x))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   644
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   645
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   646
  fun symmetricDifferenceFn sz x y =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   647
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   648
        val x = setN sz x
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   649
        and y = setN sz y
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   650
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   651
        SOME (Word.toInt (Word.xorb (x,y)))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   652
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   653
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   654
  fun unionFn sz x y =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   655
      SOME (Word.toInt (Word.orb (setN sz x, setN sz y)));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   656
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   657
  fun universeFn sz = SOME (Word.toInt (univN sz));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   658
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   659
  (* Relations *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   660
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   661
  fun memberRel sz x y =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   662
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   663
        val x = x mod eltN sz
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   664
        and y = setN sz y
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   665
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   666
        SOME (Word.andb (posN x, y) <> 0w0)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   667
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   668
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   669
  fun subsetRel sz x y =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   670
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   671
        val x = setN sz x
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   672
        and y = setN sz y
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   673
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   674
        SOME (Word.andb (x, Word.notb y) = 0w0)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   675
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   676
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   677
  val setFixed =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   678
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   679
        val fns =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   680
            NameArityMap.fromList
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   681
              [((cardName,1), fixed1 cardFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   682
               ((complementName,1), fixed1 complementFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   683
               ((differenceName,2), fixed2 differenceFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   684
               ((emptyName,0), fixed0 emptyFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   685
               ((insertName,2), fixed2 insertFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   686
               ((intersectName,2), fixed2 intersectFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   687
               ((singletonName,1), fixed1 singletonFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   688
               ((symmetricDifferenceName,2), fixed2 symmetricDifferenceFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   689
               ((unionName,2), fixed2 unionFn),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   690
               ((universeName,0), fixed0 universeFn)]
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   691
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   692
        val rels =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   693
            NameArityMap.fromList
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   694
              [((memberName,2), fixed2 memberRel),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   695
               ((subsetName,2), fixed2 subsetRel)]
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   696
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   697
        Fixed
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   698
          {functions = fns,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   699
           relations = rels}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   700
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   701
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   702
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   703
(* Lists *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   704
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   705
val appendName = Name.fromString "@"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   706
and consName = Name.fromString "::"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   707
and lengthName = Name.fromString "length"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   708
and nilName = Name.fromString "nil"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   709
and nullName = Name.fromString "null"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   710
and tailName = Name.fromString "tail";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   711
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   712
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   713
  val baseFix =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   714
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   715
        val fix = unionFixed projectionFixed overflowFixed
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   716
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   717
        val sucFn = getFunctionFixed fix (sucName,1)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   718
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   719
        fun suc2Fn sz _ x = sucFn sz [x]
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   720
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   721
        insertFunctionFixed fix ((sucName,2), fixed2 suc2Fn)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   722
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   723
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   724
  val fixMap =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   725
      {functionMap = NameArityMap.fromList
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   726
                       [((appendName,2),addName),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   727
                        ((consName,2),sucName),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   728
                        ((lengthName,1), projectionName 1),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   729
                        ((nilName,0), numeralName 0),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   730
                        ((tailName,1),preName)],
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   731
       relationMap = NameArityMap.fromList
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   732
                       [((nullName,1),isZeroName)]};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   733
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   734
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   735
  val listFixed = mapFixed fixMap baseFix;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   736
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   737
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   738
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   739
(* Valuations.                                                               *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   740
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   741
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   742
datatype valuation = Valuation of element NameMap.map;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   743
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   744
val emptyValuation = Valuation (NameMap.new ());
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   745
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   746
fun insertValuation (Valuation m) v_i = Valuation (NameMap.insert m v_i);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   747
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   748
fun peekValuation (Valuation m) v = NameMap.peek m v;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   749
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   750
fun constantValuation i =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   751
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   752
      fun add (v,V) = insertValuation V (v,i)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   753
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   754
      NameSet.foldl add emptyValuation
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   755
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   756
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   757
val zeroValuation = constantValuation zeroElement;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   758
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   759
fun getValuation V v =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   760
    case peekValuation V v of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   761
      SOME i => i
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   762
    | NONE => raise Error "Model.getValuation: incomplete valuation";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   763
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   764
fun randomValuation {size = N} vs =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   765
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   766
      fun f (v,V) = insertValuation V (v, Portable.randomInt N)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   767
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   768
      NameSet.foldl f emptyValuation vs
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   769
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   770
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   771
fun incrementValuation N vars =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   772
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   773
      fun inc vs V =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   774
          case vs of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   775
            [] => NONE
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   776
          | v :: vs =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   777
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   778
              val (carry,i) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   779
                  case incrementElement N (getValuation V v) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   780
                    SOME i => (false,i)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   781
                  | NONE => (true,zeroElement)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   782
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   783
              val V = insertValuation V (v,i)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   784
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   785
              if carry then inc vs V else SOME V
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   786
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   787
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   788
      inc (NameSet.toList vars)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   789
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   790
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   791
fun foldValuation N vars f =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   792
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   793
      val inc = incrementValuation N vars
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   794
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   795
      fun fold V acc =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   796
          let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   797
            val acc = f (V,acc)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   798
          in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   799
            case inc V of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   800
              NONE => acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   801
            | SOME V => fold V acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   802
          end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   803
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   804
      val zero = zeroValuation vars
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   805
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   806
      fold zero
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   807
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   808
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   809
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   810
(* A type of random finite mapping Z^n -> Z.                                 *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   811
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   812
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   813
val UNKNOWN = ~1;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   814
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   815
datatype table =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   816
    ForgetfulTable
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   817
  | ArrayTable of int Array.array;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   818
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   819
fun newTable N arity =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   820
    case elementListSpace {size = N} arity of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   821
      NONE => ForgetfulTable
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   822
    | SOME space => ArrayTable (Array.array (space,UNKNOWN));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   823
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   824
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   825
  fun randomResult R = Portable.randomInt R;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   826
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   827
  fun lookupTable N R table elts =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   828
      case table of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   829
        ForgetfulTable => randomResult R
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   830
      | ArrayTable a =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   831
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   832
          val i = elementListIndex {size = N} elts
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   833
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   834
          val r = Array.sub (a,i)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   835
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   836
          if r <> UNKNOWN then r
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   837
          else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   838
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   839
              val r = randomResult R
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   840
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   841
              val () = Array.update (a,i,r)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   842
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   843
              r
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   844
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   845
        end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   846
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   847
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   848
fun updateTable N table (elts,r) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   849
    case table of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   850
      ForgetfulTable => ()
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   851
    | ArrayTable a =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   852
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   853
        val i = elementListIndex {size = N} elts
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   854
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   855
        val () = Array.update (a,i,r)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   856
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   857
        ()
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   858
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   859
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   860
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   861
(* A type of random finite mappings name * arity -> Z^arity -> Z.            *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   862
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   863
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   864
datatype tables =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   865
    Tables of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   866
      {domainSize : int,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   867
       rangeSize : int,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   868
       tableMap : table NameArityMap.map ref};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   869
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   870
fun newTables N R =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   871
    Tables
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   872
      {domainSize = N,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   873
       rangeSize = R,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   874
       tableMap = ref (NameArityMap.new ())};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   875
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   876
fun getTables tables n_a =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   877
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   878
      val Tables {domainSize = N, rangeSize = _, tableMap = tm} = tables
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   879
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   880
      val ref m = tm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   881
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   882
      case NameArityMap.peek m n_a of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   883
        SOME t => t
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   884
      | NONE =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   885
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   886
          val (_,a) = n_a
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   887
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   888
          val t = newTable N a
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   889
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   890
          val m = NameArityMap.insert m (n_a,t)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   891
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   892
          val () = tm := m
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   893
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   894
          t
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   895
        end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   896
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   897
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   898
fun lookupTables tables (n,elts) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   899
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   900
      val Tables {domainSize = N, rangeSize = R, ...} = tables
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   901
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   902
      val a = length elts
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   903
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   904
      val table = getTables tables (n,a)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   905
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   906
      lookupTable N R table elts
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   907
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   908
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   909
fun updateTables tables ((n,elts),r) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   910
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   911
      val Tables {domainSize = N, ...} = tables
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   912
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   913
      val a = length elts
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   914
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   915
      val table = getTables tables (n,a)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   916
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   917
      updateTable N table (elts,r)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   918
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   919
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   920
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   921
(* A type of random finite models.                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   922
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   923
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   924
type parameters = {size : int, fixed : fixed};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   925
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   926
datatype model =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   927
    Model of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   928
      {size : int,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   929
       fixedFunctions : (element list -> element option) NameArityMap.map,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   930
       fixedRelations : (element list -> bool option) NameArityMap.map,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   931
       randomFunctions : tables,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   932
       randomRelations : tables};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   933
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   934
fun new {size = N, fixed} =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   935
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   936
      val Fixed {functions = fns, relations = rels} = fixed
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   937
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   938
      val fixFns = NameArityMap.transform (fn f => f {size = N}) fns
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   939
      and fixRels = NameArityMap.transform (fn r => r {size = N}) rels
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   940
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   941
      val rndFns = newTables N N
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   942
      and rndRels = newTables N 2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   943
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   944
      Model
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   945
        {size = N,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   946
         fixedFunctions = fixFns,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   947
         fixedRelations = fixRels,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   948
         randomFunctions = rndFns,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   949
         randomRelations = rndRels}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   950
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   951
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   952
fun size (Model {size = N, ...}) = N;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   953
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   954
fun peekFixedFunction M (n,elts) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   955
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   956
      val Model {fixedFunctions = fixFns, ...} = M
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   957
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   958
      case NameArityMap.peek fixFns (n, length elts) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   959
        NONE => NONE
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   960
      | SOME fixFn => fixFn elts
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   961
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   962
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   963
fun isFixedFunction M n_elts = Option.isSome (peekFixedFunction M n_elts);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   964
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   965
fun peekFixedRelation M (n,elts) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   966
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   967
      val Model {fixedRelations = fixRels, ...} = M
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   968
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   969
      case NameArityMap.peek fixRels (n, length elts) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   970
        NONE => NONE
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   971
      | SOME fixRel => fixRel elts
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   972
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   973
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   974
fun isFixedRelation M n_elts = Option.isSome (peekFixedRelation M n_elts);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   975
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   976
(* A default model *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   977
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   978
val defaultSize = 8;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   979
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   980
val defaultFixed =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   981
    unionListFixed
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   982
      [basicFixed,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   983
       projectionFixed,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   984
       modularFixed,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   985
       setFixed,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   986
       listFixed];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   987
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   988
val default = {size = defaultSize, fixed = defaultFixed};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   989
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   990
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   991
(* Taking apart terms to interpret them.                                     *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   992
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   993
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   994
fun destTerm tm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   995
    case tm of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   996
      Term.Var _ => tm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   997
    | Term.Fn f_tms =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   998
      case Term.stripApp tm of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   999
        (_,[]) => tm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1000
      | (v as Term.Var _, tms) => Term.Fn (Term.appName, v :: tms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1001
      | (Term.Fn (f,tms), tms') => Term.Fn (f, tms @ tms');
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1002
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1003
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1004
(* Interpreting terms and formulas in the model.                             *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1005
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1006
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1007
fun interpretFunction M n_elts =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1008
    case peekFixedFunction M n_elts of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1009
      SOME r => r
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1010
    | NONE =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1011
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1012
        val Model {randomFunctions = rndFns, ...} = M
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1013
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1014
        lookupTables rndFns n_elts
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1015
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1016
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1017
fun interpretRelation M n_elts =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1018
    case peekFixedRelation M n_elts of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1019
      SOME r => r
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1020
    | NONE =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1021
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1022
        val Model {randomRelations = rndRels, ...} = M
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1023
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1024
        intToBool (lookupTables rndRels n_elts)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1025
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1026
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1027
fun interpretTerm M V =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1028
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1029
      fun interpret tm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1030
          case destTerm tm of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1031
            Term.Var v => getValuation V v
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1032
          | Term.Fn (f,tms) => interpretFunction M (f, map interpret tms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1033
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1034
      interpret
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1035
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1036
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1037
fun interpretAtom M V (r,tms) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1038
    interpretRelation M (r, map (interpretTerm M V) tms);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1039
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1040
fun interpretFormula M =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1041
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1042
      val N = size M
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1043
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1044
      fun interpret V fm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1045
          case fm of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1046
            Formula.True => true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1047
          | Formula.False => false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1048
          | Formula.Atom atm => interpretAtom M V atm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1049
          | Formula.Not p => not (interpret V p)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1050
          | Formula.Or (p,q) => interpret V p orelse interpret V q
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1051
          | Formula.And (p,q) => interpret V p andalso interpret V q
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1052
          | Formula.Imp (p,q) => interpret V (Formula.Or (Formula.Not p, q))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1053
          | Formula.Iff (p,q) => interpret V p = interpret V q
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1054
          | Formula.Forall (v,p) => interpret' V p v N
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1055
          | Formula.Exists (v,p) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1056
            interpret V (Formula.Not (Formula.Forall (v, Formula.Not p)))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1057
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1058
      and interpret' V fm v i =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1059
          i = 0 orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1060
          let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1061
            val i = i - 1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1062
            val V' = insertValuation V (v,i)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1063
          in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1064
            interpret V' fm andalso interpret' V fm v i
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1065
          end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1066
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1067
      interpret
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1068
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1069
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1070
fun interpretLiteral M V (pol,atm) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1071
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1072
      val b = interpretAtom M V atm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1073
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1074
      if pol then b else not b
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1075
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1076
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1077
fun interpretClause M V cl = LiteralSet.exists (interpretLiteral M V) cl;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1078
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1079
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1080
(* Check whether random groundings of a formula are true in the model.       *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1081
(* Note: if it's cheaper, a systematic check will be performed instead.      *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1082
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1083
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1084
fun check interpret {maxChecks} M fv x =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1085
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1086
      val N = size M
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1087
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1088
      fun score (V,{T,F}) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1089
          if interpret M V x then {T = T + 1, F = F} else {T = T, F = F + 1}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1090
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1091
      fun randomCheck acc = score (randomValuation {size = N} fv, acc)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1092
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1093
      val maxChecks =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1094
          case maxChecks of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1095
            NONE => maxChecks
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1096
          | SOME m =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1097
            case expInt N (NameSet.size fv) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1098
              SOME n => if n <= m then NONE else maxChecks
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1099
            | NONE => maxChecks
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1100
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1101
      case maxChecks of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1102
        SOME m => funpow m randomCheck {T = 0, F = 0}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1103
      | NONE => foldValuation {size = N} fv score {T = 0, F = 0}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1104
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1105
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1106
fun checkAtom maxChecks M atm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1107
    check interpretAtom maxChecks M (Atom.freeVars atm) atm;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1108
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1109
fun checkFormula maxChecks M fm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1110
    check interpretFormula maxChecks M (Formula.freeVars fm) fm;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1111
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1112
fun checkLiteral maxChecks M lit =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1113
    check interpretLiteral maxChecks M (Literal.freeVars lit) lit;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1114
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1115
fun checkClause maxChecks M cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1116
    check interpretClause maxChecks M (LiteralSet.freeVars cl) cl;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1117
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1118
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1119
(* Updating the model.                                                       *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1120
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1121
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1122
fun updateFunction M func_elts_elt =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1123
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1124
      val Model {randomFunctions = rndFns, ...} = M
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1125
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1126
      val () = updateTables rndFns func_elts_elt
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1127
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1128
      ()
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1129
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1130
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1131
fun updateRelation M (rel_elts,pol) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1132
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1133
      val Model {randomRelations = rndRels, ...} = M
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1134
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1135
      val () = updateTables rndRels (rel_elts, boolToInt pol)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1136
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1137
      ()
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1138
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1139
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1140
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1141
(* A type of terms with interpretations embedded in the subterms.            *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1142
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1143
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1144
datatype modelTerm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1145
    ModelVar
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1146
  | ModelFn of Term.functionName * modelTerm list * int list;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1147
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1148
fun modelTerm M V =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1149
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1150
      fun modelTm tm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1151
          case destTerm tm of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1152
            Term.Var v => (ModelVar, getValuation V v)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1153
          | Term.Fn (f,tms) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1154
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1155
              val (tms,xs) = unzip (map modelTm tms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1156
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1157
              (ModelFn (f,tms,xs), interpretFunction M (f,xs))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1158
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1159
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1160
      modelTm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1161
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1162
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1163
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1164
(* Perturbing the model.                                                     *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1165
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1166
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1167
datatype perturbation =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1168
    FunctionPerturbation of (Term.functionName * element list) * element
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1169
  | RelationPerturbation of (Atom.relationName * element list) * bool;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1170
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1171
fun perturb M pert =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1172
    case pert of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1173
      FunctionPerturbation func_elts_elt => updateFunction M func_elts_elt
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1174
    | RelationPerturbation rel_elts_pol => updateRelation M rel_elts_pol;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1175
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1176
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1177
  fun pertTerm _ [] _ acc = acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1178
    | pertTerm M target tm acc =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1179
      case tm of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1180
        ModelVar => acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1181
      | ModelFn (func,tms,xs) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1182
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1183
          fun onTarget ys = mem (interpretFunction M (func,ys)) target
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1184
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1185
          val func_xs = (func,xs)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1186
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1187
          val acc =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1188
              if isFixedFunction M func_xs then acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1189
              else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1190
                let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1191
                  fun add (y,acc) = FunctionPerturbation (func_xs,y) :: acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1192
                in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1193
                  foldl add acc target
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1194
                end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1195
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1196
          pertTerms M onTarget tms xs acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1197
        end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1198
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1199
  and pertTerms M onTarget =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1200
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1201
        val N = size M
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1202
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1203
        fun filterElements pred =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1204
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1205
              fun filt 0 acc = acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1206
                | filt i acc =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1207
                  let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1208
                    val i = i - 1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1209
                    val acc = if pred i then i :: acc else acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1210
                  in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1211
                    filt i acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1212
                  end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1213
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1214
              filt N []
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1215
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1216
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1217
        fun pert _ [] [] acc = acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1218
          | pert ys (tm :: tms) (x :: xs) acc =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1219
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1220
              fun pred y =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1221
                  y <> x andalso onTarget (List.revAppend (ys, y :: xs))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1222
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1223
              val target = filterElements pred
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1224
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1225
              val acc = pertTerm M target tm acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1226
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1227
              pert (x :: ys) tms xs acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1228
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1229
          | pert _ _ _ _ = raise Bug "Model.pertTerms.pert"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1230
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1231
        pert []
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1232
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1233
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1234
  fun pertAtom M V target (rel,tms) acc =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1235
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1236
        fun onTarget ys = interpretRelation M (rel,ys) = target
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1237
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1238
        val (tms,xs) = unzip (map (modelTerm M V) tms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1239
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1240
        val rel_xs = (rel,xs)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1241
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1242
        val acc =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1243
            if isFixedRelation M rel_xs then acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1244
            else RelationPerturbation (rel_xs,target) :: acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1245
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1246
        pertTerms M onTarget tms xs acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1247
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1248
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1249
  fun pertLiteral M V ((pol,atm),acc) = pertAtom M V pol atm acc;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1250
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1251
  fun pertClause M V cl acc = LiteralSet.foldl (pertLiteral M V) acc cl;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1252
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1253
  fun pickPerturb M perts =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1254
      if null perts then ()
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1255
      else perturb M (List.nth (perts, Portable.randomInt (length perts)));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1256
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1257
  fun perturbTerm M V (tm,target) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1258
      pickPerturb M (pertTerm M target (fst (modelTerm M V tm)) []);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1259
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1260
  fun perturbAtom M V (atm,target) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1261
      pickPerturb M (pertAtom M V target atm []);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1262
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1263
  fun perturbLiteral M V lit = pickPerturb M (pertLiteral M V (lit,[]));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1264
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1265
  fun perturbClause M V cl = pickPerturb M (pertClause M V cl []);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1266
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1267
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1268
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1269
(* Pretty printing.                                                          *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1270
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1271
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1272
fun pp M =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1273
    Print.program
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1274
      [Print.addString "Model{",
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1275
       Print.ppInt (size M),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1276
       Print.addString "}"];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1277
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
  1278
end