0

1 
(* Title: CCL/types.thy


2 
ID: $Id$


3 
Author: Martin Coen


4 
Copyright 1993 University of Cambridge


5 


6 
Types in CCL are defined as sets of terms.


7 


8 
*)


9 


10 
Type = Term +


11 


12 
consts


13 


14 
Subtype :: "['a set, 'a => o] => 'a set"


15 
Bool :: "i set"


16 
Unit :: "i set"


17 
"+" :: "[i set, i set] => i set" (infixr 55)


18 
Pi :: "[i set, i => i set] => i set"


19 
Sigma :: "[i set, i => i set] => i set"


20 
Nat :: "i set"


21 
List :: "i set => i set"


22 
Lists :: "i set => i set"


23 
ILists :: "i set => i set"


24 
TAll :: "(i set => i set) => i set" (binder "TALL " 55)


25 
TEx :: "(i set => i set) => i set" (binder "TEX " 55)


26 
Lift :: "i set => i set" ("(3[_])")


27 


28 
SPLIT :: "[i, [i, i] => i set] => i set"


29 


30 
"@Pi" :: "[idt, i set, i set] => i set" ("(3PROD _:_./ _)" [] 60)


31 
"@Sigma" :: "[idt, i set, i set] => i set" ("(3SUM _:_./ _)" [] 60)


32 
"@>" :: "[i set, i set] => i set" ("(_ >/ _)" [54, 53] 53)


33 
"@*" :: "[i set, i set] => i set" ("(_ */ _)" [56, 55] 55)


34 
"@Subtype" :: "[idt, 'a set, o] => 'a set" ("(1{_: _ ./ _})")


35 


36 
translations


37 
"PROD x:A. B" => "Pi(A, %x. B)"


38 
"SUM x:A. B" => "Sigma(A, %x. B)"


39 
"{x: A. B}" == "Subtype(A, %x. B)"


40 


41 
rules


42 


43 
Subtype_def "{x:A.P(x)} == {x.x:A & P(x)}"


44 
Unit_def "Unit == {x.x=one}"


45 
Bool_def "Bool == {x.x=true  x=false}"


46 
Plus_def "A+B == {x. (EX a:A.x=inl(a))  (EX b:B.x=inr(b))}"


47 
Pi_def "Pi(A,B) == {x.EX b.x=lam x.b(x) & (ALL x:A.b(x):B(x))}"


48 
Sigma_def "Sigma(A,B) == {x.EX a:A.EX b:B(a).x=<a,b>}"


49 
Nat_def "Nat == lfp(% X.Unit + X)"


50 
List_def "List(A) == lfp(% X.Unit + A*X)"


51 


52 
Lists_def "Lists(A) == gfp(% X.Unit + A*X)"


53 
ILists_def "ILists(A) == gfp(% X.{} + A*X)"


54 


55 
Tall_def "TALL X.B(X) == Inter({X.EX Y.X=B(Y)})"


56 
Tex_def "TEX X.B(X) == Union({X.EX Y.X=B(Y)})"


57 
Lift_def "[A] == A Un {bot}"


58 


59 
SPLIT_def "SPLIT(p,B) == Union({A.EX x y.p=<x,y> & A=B(x,y)})"


60 


61 
end


62 


63 


64 
ML


65 


66 
val parse_translation =


67 
[("@>", ndependent_tr "Pi"),


68 
("@*", ndependent_tr "Sigma")];


69 


70 
val print_translation =


71 
[("Pi", dependent_tr' ("@Pi", "@>")),


72 
("Sigma", dependent_tr' ("@Sigma", "@*"))];


73 
