src/HOLCF/Sprod0.thy
changeset 243 c22b85994e17
child 1150 66512c9e6bd6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/HOLCF/Sprod0.thy	Wed Jan 19 17:35:01 1994 +0100
@@ -0,0 +1,53 @@
+(*  Title: 	HOLCF/sprod0.thy
+    ID:         $Id$
+    Author: 	Franz Regensburger
+    Copyright   1993  Technische Universitaet Muenchen
+
+Strict product
+*)
+
+Sprod0 = Cfun3 +
+
+(* new type for strict product *)
+
+types "**" 2        (infixr 20)
+
+arities "**" :: (pcpo,pcpo)term	
+
+consts
+  Sprod		:: "('a => 'b => bool)set"
+  Spair_Rep	:: "['a,'b] => ['a,'b] => bool"
+  Rep_Sprod	:: "('a ** 'b) => ('a => 'b => bool)"
+  Abs_Sprod	:: "('a => 'b => bool) => ('a ** 'b)"
+  Ispair	:: "['a,'b] => ('a ** 'b)"
+  Isfst		:: "('a ** 'b) => 'a"
+  Issnd		:: "('a ** 'b) => 'b"  
+
+rules
+
+  Spair_Rep_def		"Spair_Rep == (%a b. %x y.\
+\				(~a=UU & ~b=UU --> x=a  & y=b ))"
+
+  Sprod_def		"Sprod == {f. ? a b. f = Spair_Rep(a,b)}"
+
+  (*faking a type definition... *)
+  (* "**" is isomorphic to Sprod *)
+
+  Rep_Sprod		"Rep_Sprod(p):Sprod"		
+  Rep_Sprod_inverse	"Abs_Sprod(Rep_Sprod(p)) = p"	
+  Abs_Sprod_inverse	"f:Sprod ==> Rep_Sprod(Abs_Sprod(f)) = f"
+
+   (*defining the abstract constants*)
+
+  Ispair_def	"Ispair(a,b) == Abs_Sprod(Spair_Rep(a,b))"
+
+  Isfst_def	"Isfst(p) == @z.\
+\					(p=Ispair(UU,UU) --> z=UU)\
+\		&(! a b. ~a=UU & ~b=UU & p=Ispair(a,b)   --> z=a)"  
+
+  Issnd_def	"Issnd(p) == @z.\
+\					(p=Ispair(UU,UU) --> z=UU)\
+\		&(! a b. ~a=UU & ~b=UU & p=Ispair(a,b)   --> z=b)"  
+
+end
+