src/ZF/UNITY/GenPrefix.thy
changeset 12197 d9320fb0a570
child 14046 6616e6c53d48
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ZF/UNITY/GenPrefix.thy	Thu Nov 15 16:46:38 2001 +0100
@@ -0,0 +1,59 @@
+(*  Title:      ZF/UNITY/GenPrefix.thy
+    ID:         $Id$
+    Author:     Sidi O Ehmety, Cambridge University Computer Laboratory
+    Copyright   2001  University of Cambridge
+
+Charpentier's Generalized Prefix Relation
+   <xs,ys>:gen_prefix(r)
+     if ys = xs' @ zs where length(xs) = length(xs')
+     and corresponding elements of xs, xs' are pairwise related by r
+
+Based on Lex/Prefix
+*)
+
+GenPrefix = ListPlus + 
+
+consts
+  gen_prefix :: "[i, i] => i"
+  
+inductive
+  (* Parameter A is the domain of zs's elements *)
+  
+  domains "gen_prefix(A, r)" <= "list(A)*list(A)"
+  
+  intrs
+    Nil     "<[],[]>:gen_prefix(A, r)"
+
+    prepend "[| <xs,ys>:gen_prefix(A, r);  <x,y>:r; x:A; y:A |]
+	      ==> <Cons(x,xs), Cons(y,ys)>: gen_prefix(A, r)"
+
+    append  "[| <xs,ys>:gen_prefix(A, r); zs:list(A) |]
+	     ==> <xs, ys@zs>:gen_prefix(A, r)"
+    type_intrs "list.intrs@[app_type]"
+
+constdefs
+   prefix :: i=>i
+  "prefix(A) == gen_prefix(A, id(A))"
+
+   strict_prefix :: i=>i  
+  "strict_prefix(A) == prefix(A) - id(list(A))"
+
+  (* Probably to be moved elsewhere *)
+
+   Le :: i
+  "Le == {<x,y>:nat*nat. x le y}"
+  
+   Ge :: i
+  "Ge == {<x,y>:nat*nat. y le x}"
+
+syntax
+  (* less or equal and greater or equal over prefixes *)
+  pfixLe :: [i, i] => o               (infixl "pfixLe" 50)
+  pfixGe :: [i, i] => o               (infixl "pfixGe" 50)
+
+translations
+   "xs pfixLe ys" == "<xs, ys>:gen_prefix(nat, Le)"
+   "xs pfixGe ys" == "<xs, ys>:gen_prefix(nat, Ge)"
+  
+
+end