src/HOLCF/ax_ops/holcflogic.ML
author oheimb
Mon, 27 Oct 1997 11:34:33 +0100
changeset 4008 2444085532c6
parent 2719 27167b432e7a
permissions -rw-r--r--
adapted domain and ax_ops package for name spaces
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     1
(*
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     2
    ID:         $Id$
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     3
    Author:     Tobias Mayr
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     4
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     5
Additional term and type constructors, extension of Pure/term.ML, logic.ML
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     6
and HOL/hologic.ML
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     7
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     8
TODO:
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     9
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    10
*)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    11
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    12
signature HOLCFLOGIC =
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    13
sig
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    14
 val True  : term;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    15
 val False : term;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    16
 val Imp   : term;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    17
 val And   : term;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    18
 val Not   : term;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    19
 val mkNot : term -> term;                (* negates, no Trueprop *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    20
 val mkNotEqUU : term -> term;            (* Trueprop(x ~= UU) *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    21
 val mkNotEqUU_in : term -> term -> term; (* "v~=UU ==> t" *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    22
 val ==>     : typ * typ -> typ;          (* Infix operation typ constructor *)
4008
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 2719
diff changeset
    23
 val cfun_arrow : string                  (* internalized "->" *)
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    24
 val mkOpApp : term -> term -> term;      (* Ops application (f ` x) *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    25
 val mkCPair : term -> term -> term;      (* cpair constructor *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    26
end;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    27
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    28
structure HOLCFlogic : HOLCFLOGIC =
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    29
struct
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    30
open Logic 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    31
open HOLogic
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    32
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    33
val True = Const("True",boolT);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    34
val False = Const("False",boolT);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    35
val Imp = Const("op -->",boolT --> boolT --> boolT);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    36
val And = Const("op &",boolT --> boolT --> boolT);
2719
27167b432e7a Renamed constant "not" to "Not"
paulson
parents: 1284
diff changeset
    37
val Not = Const("Not",boolT --> boolT);   
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    38
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    39
fun mkNot A = Not $ A; (* negates, no Trueprop *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    40
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    41
(* Trueprop(x ~= UU) *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    42
fun mkNotEqUU v = mk_Trueprop(mkNot(mk_eq(v,Const("UU",fastype_of v))));
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    43
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    44
(* mkNotEqUU_in v t = "v~=UU ==> t" *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    45
fun mkNotEqUU_in vterm term = 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    46
   mk_implies(mkNotEqUU vterm,term)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    47
4008
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 2719
diff changeset
    48
val HOLCF_sg = sign_of HOLCF.thy;
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 2719
diff changeset
    49
fun mk_typ t (S,T) = Sign.intern_typ HOLCF_sg (Type(t,[S,T]));
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 2719
diff changeset
    50
fun rep_Type  (Type  x) = x| rep_Type _ = error "Internal error: rep_Type";
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    51
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    52
infixr 6 ==>; (* the analogon to --> for operations *)
4008
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 2719
diff changeset
    53
val op ==> = mk_typ "->";
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 2719
diff changeset
    54
val cfun_arrow = fst (rep_Type (dummyT ==> dummyT));
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    55
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    56
(* Ops application (f ` x) *)
4008
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 2719
diff changeset
    57
fun mkOpApp (f as Const(_,ft as Type(_(*"->"*),[xt,rt]))) x =
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    58
     Const("fapp",ft --> xt --> rt) $ f $ x
1284
e5b95ee2616b removed incompatibility with sml
regensbu
parents: 1274
diff changeset
    59
  | mkOpApp f x = (error("Internal error: mkOpApp: wrong args"));
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    60
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    61
(* cpair constructor *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    62
fun mkCPair x y = let val tx = fastype_of x
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    63
                       val ty = fastype_of y
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    64
                   in  
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    65
      Const("fapp",(ty==>Type("*",[tx,ty]))-->ty-->Type("*",[tx,ty])) $
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    66
      (mkOpApp (Const("cpair",tx ==> ty ==> Type("*",[tx,ty]))) x) $ y
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    67
                   end;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    68
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    69
end;