src/HOL/HOL.thy
author nipkow
Tue, 09 May 1995 22:10:08 +0200
changeset 1114 c8dfb56a7e95
parent 1068 e0f2dffab506
child 1232 454eb424c223
permissions -rw-r--r--
Prod is now a parent of Lfp. Added thm induct2 to Lfp. Changed the way patterns in abstractions are pretty printed. It has become simpler now but fails if split has more than one argument because then the ast-translation does not match.

(*  Title:      HOL/HOL.thy
    ID:         $Id$
    Author:     Tobias Nipkow
    Copyright   1993  University of Cambridge

Higher-Order Logic
*)

HOL = CPure +

classes
  term < logic

axclass
  plus < term

axclass
  minus < term

axclass
  times < term

default
  term

types
  bool

arities
  fun :: (term, term) term
  bool :: term


consts

  (* Constants *)

  Trueprop      :: "bool => prop"                     ("(_)" 5)
  not           :: "bool => bool"                     ("~ _" [40] 40)
  True, False   :: "bool"
  If            :: "[bool, 'a, 'a] => 'a"   ("(if (_)/ then (_)/ else (_))" 10)
  Inv           :: "('a => 'b) => ('b => 'a)"

  (* Binders *)

  Eps           :: "('a => bool) => 'a"
  All           :: "('a => bool) => bool"             (binder "! " 10)
  Ex            :: "('a => bool) => bool"             (binder "? " 10)
  Ex1           :: "('a => bool) => bool"             (binder "?! " 10)
  Let           :: "['a, 'a => 'b] => 'b"

  (* Infixes *)

  o             :: "['b => 'c, 'a => 'b, 'a] => 'c"   (infixr 50)
  "="           :: "['a, 'a] => bool"                 (infixl 50)
  "&"           :: "[bool, bool] => bool"             (infixr 35)
  "|"           :: "[bool, bool] => bool"             (infixr 30)
  "-->"         :: "[bool, bool] => bool"             (infixr 25)

  (* Overloaded Constants *)

  "+"           :: "['a::plus, 'a] => 'a"             (infixl 65)
  "-"           :: "['a::minus, 'a] => 'a"            (infixl 65)
  "*"           :: "['a::times, 'a] => 'a"            (infixl 70)


types
  letbinds  letbind
  case_syn  cases_syn

syntax

  "~="          :: "['a, 'a] => bool"                 (infixl 50)

  "@Eps"        :: "[pttrn,bool] => 'a"               ("(3@ _./ _)" 10)

  (* Alternative Quantifiers *)

  "*All"        :: "[idts, bool] => bool"             ("(3ALL _./ _)" 10)
  "*Ex"         :: "[idts, bool] => bool"             ("(3EX _./ _)" 10)
  "*Ex1"        :: "[idts, bool] => bool"             ("(3EX! _./ _)" 10)

  (* Let expressions *)

  "_bind"       :: "[pttrn, 'a] => letbind"           ("(2_ =/ _)" 10)
  ""            :: "letbind => letbinds"              ("_")
  "_binds"      :: "[letbind, letbinds] => letbinds"  ("_;/ _")
  "_Let"        :: "[letbinds, 'a] => 'a"             ("(let (_)/ in (_))" 10)

  (* Case expressions *)

  "@case"       :: "['a, cases_syn] => 'b"            ("(case _ of/ _)" 10)
  "@case1"      :: "['a, 'b] => case_syn"             ("(2_ =>/ _)" 10)
  ""            :: "case_syn => cases_syn"            ("_")
  "@case2"      :: "[case_syn, cases_syn] => cases_syn"   ("_/ | _")

translations
  "x ~= y"      == "~ (x = y)"
  "@ x.b"       == "Eps(%x.b)"
  "ALL xs. P"   => "! xs. P"
  "EX xs. P"    => "? xs. P"
  "EX! xs. P"   => "?! xs. P"
  "_Let (_binds b bs) e"  == "_Let b (_Let bs e)"
  "let x = a in e"        == "Let a (%x. e)"

rules

  eq_reflection "(x=y) ==> (x==y)"

  (* Basic Rules *)

  refl          "t = (t::'a)"
  subst         "[| s = t; P(s) |] ==> P(t::'a)"
  ext           "(!!x::'a. (f(x)::'b) = g(x)) ==> (%x.f(x)) = (%x.g(x))"
  selectI       "P(x::'a) ==> P(@x.P(x))"

  impI          "(P ==> Q) ==> P-->Q"
  mp            "[| P-->Q;  P |] ==> Q"

defs

  True_def      "True      == ((%x::bool.x)=(%x.x))"
  All_def       "All(P)    == (P = (%x.True))"
  Ex_def        "Ex(P)     == P(@x.P(x))"
  False_def     "False     == (!P.P)"
  not_def       "~ P       == P-->False"
  and_def       "P & Q     == !R. (P-->Q-->R) --> R"
  or_def        "P | Q     == !R. (P-->R) --> (Q-->R) --> R"
  Ex1_def       "Ex1(P)    == ? x. P(x) & (! y. P(y) --> y=x)"

rules
  (* Axioms *)

  iff           "(P-->Q) --> (Q-->P) --> (P=Q)"
  True_or_False "(P=True) | (P=False)"

defs
  (* Misc Definitions *)

  Let_def       "Let s f == f(s)"
  Inv_def       "Inv(f::'a=>'b)  == (% y. @x. f(x)=y)"
  o_def         "(f::'b=>'c) o g == (%(x::'a). f(g(x)))"
  if_def        "If P x y == @z::'a. (P=True --> z=x) & (P=False --> z=y)"

end


ML

(** Choice between the HOL and Isabelle style of quantifiers **)

val HOL_quantifiers = ref true;

fun alt_ast_tr' (name, alt_name) =
  let
    fun ast_tr' (*name*) args =
      if ! HOL_quantifiers then raise Match
      else Syntax.mk_appl (Syntax.Constant alt_name) args;
  in
    (name, ast_tr')
  end;


val print_ast_translation =
  map alt_ast_tr' [("! ", "*All"), ("? ", "*Ex"), ("?! ", "*Ex1")];