:: On Ordering of Bags
:: by Gilbert Lee and Piotr Rudnicki
::
:: Copyright (c) 2002-2017 Association of Mizar Users

theorem Th1: :: BAGORDER:1
for x, y, z being set st z in x & z in y & x \ {z} = y \ {z} holds
x = y
proof end;

theorem :: BAGORDER:2
for n, k being Element of NAT holds
( k in Seg n iff ( k - 1 is Element of NAT & k - 1 < n ) )
proof end;

registration
let f be finite-support Function;
let X be set ;
coherence
f | X is finite-support
proof end;
end;

theorem :: BAGORDER:3
canceled;

::\$CT
theorem Th3: :: BAGORDER:4
for fs being FinSequence of NAT holds
( Sum fs = 0 iff fs = (len fs) |-> 0 )
proof end;

definition
let n, i, j be Nat;
let b be ManySortedSet of n;
func (i,j) -cut b -> ManySortedSet of j -' i means :Def1: :: BAGORDER:def 1
for k being Element of NAT st k in j -' i holds
it . k = b . (i + k);
existence
ex b1 being ManySortedSet of j -' i st
for k being Element of NAT st k in j -' i holds
b1 . k = b . (i + k)
proof end;
uniqueness
for b1, b2 being ManySortedSet of j -' i st ( for k being Element of NAT st k in j -' i holds
b1 . k = b . (i + k) ) & ( for k being Element of NAT st k in j -' i holds
b2 . k = b . (i + k) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def1 defines -cut BAGORDER:def 1 :
for n, i, j being Nat
for b being ManySortedSet of n
for b5 being ManySortedSet of j -' i holds
( b5 = (i,j) -cut b iff for k being Element of NAT st k in j -' i holds
b5 . k = b . (i + k) );

registration
let n, i, j be Nat;
let b be natural-valued ManySortedSet of n;
cluster (i,j) -cut b -> natural-valued ;
coherence
(i,j) -cut b is natural-valued
proof end;
end;

registration
let n, i, j be Element of NAT ;
let b be finite-support ManySortedSet of n;
cluster (i,j) -cut b -> finite-support ;
coherence
(i,j) -cut b is finite-support
;
end;

theorem Th4: :: BAGORDER:5
for n, i being Nat
for a, b being ManySortedSet of n holds
( a = b iff ( (0,(i + 1)) -cut a = (0,(i + 1)) -cut b & ((i + 1),n) -cut a = ((i + 1),n) -cut b ) )
proof end;

definition
let x be non empty set ;
let n be non zero Element of NAT ;
func Fin (x,n) -> set equals :: BAGORDER:def 2
{ y where y is Subset of x : ( y is finite & not y is empty & card y c= n ) } ;
coherence
{ y where y is Subset of x : ( y is finite & not y is empty & card y c= n ) } is set
;
end;

:: deftheorem defines Fin BAGORDER:def 2 :
for x being non empty set
for n being non zero Element of NAT holds Fin (x,n) = { y where y is Subset of x : ( y is finite & not y is empty & card y c= n ) } ;

registration
let x be non empty set ;
let n be non zero Element of NAT ;
cluster Fin (x,n) -> non empty ;
coherence
not Fin (x,n) is empty
proof end;
end;

theorem Th5: :: BAGORDER:6
for R being non empty transitive antisymmetric RelStr
for X being finite Subset of R st X <> {} holds
ex x being Element of R st
( x in X & x is_maximal_wrt X, the InternalRel of R )
proof end;

theorem Th6: :: BAGORDER:7
for R being non empty transitive antisymmetric RelStr
for X being finite Subset of R st X <> {} holds
ex x being Element of R st
( x in X & x is_minimal_wrt X, the InternalRel of R )
proof end;

theorem :: BAGORDER:8
for R being non empty transitive antisymmetric RelStr
for f being sequence of R st f is descending holds
for j, i being Nat st i < j holds
( f . i <> f . j & [(f . j),(f . i)] in the InternalRel of R )
proof end;

definition
let R be non empty RelStr ;
let s be sequence of R;
attr s is non-increasing means :: BAGORDER:def 3
for i being Nat holds [(s . (i + 1)),(s . i)] in the InternalRel of R;
end;

:: deftheorem defines non-increasing BAGORDER:def 3 :
for R being non empty RelStr
for s being sequence of R holds
( s is non-increasing iff for i being Nat holds [(s . (i + 1)),(s . i)] in the InternalRel of R );

theorem Th8: :: BAGORDER:9
for R being non empty transitive RelStr
for f being sequence of R st f is non-increasing holds
for j, i being Nat st i < j holds
[(f . j),(f . i)] in the InternalRel of R
proof end;

theorem Th9: :: BAGORDER:10
for R being non empty transitive RelStr
for s being sequence of R st R is well_founded & s is non-increasing holds
ex p being Nat st
for r being Nat st p <= r holds
s . p = s . r
proof end;

theorem Th10: :: BAGORDER:11
for X being set
for a being Element of X
for A being finite Subset of X
for R being Order of X st A = {a} & R linearly_orders A holds
SgmX (R,A) = <*a*>
proof end;

definition
let n be Ordinal;
let b be bag of n;
func TotDegree b -> Nat means :Def4: :: BAGORDER:def 4
ex f being FinSequence of NAT st
( it = Sum f & f = b * (SgmX ((),())) );
existence
ex b1 being Nat ex f being FinSequence of NAT st
( b1 = Sum f & f = b * (SgmX ((),())) )
proof end;
uniqueness
for b1, b2 being Nat st ex f being FinSequence of NAT st
( b1 = Sum f & f = b * (SgmX ((),())) ) & ex f being FinSequence of NAT st
( b2 = Sum f & f = b * (SgmX ((),())) ) holds
b1 = b2
;
end;

:: deftheorem Def4 defines TotDegree BAGORDER:def 4 :
for n being Ordinal
for b being bag of n
for b3 being Nat holds
( b3 = TotDegree b iff ex f being FinSequence of NAT st
( b3 = Sum f & f = b * (SgmX ((),())) ) );

theorem Th11: :: BAGORDER:12
for n being Ordinal
for b being bag of n
for s being finite Subset of n
for f, g being FinSequence of NAT st f = b * (SgmX ((),())) & g = b * (SgmX ((),(() \/ s))) holds
Sum f = Sum g
proof end;

theorem Th12: :: BAGORDER:13
for n being Ordinal
for a, b being bag of n holds TotDegree (a + b) = () + ()
proof end;

theorem :: BAGORDER:14
for n being Ordinal
for a, b being bag of n st b divides a holds
TotDegree (a -' b) = () - ()
proof end;

theorem Th14: :: BAGORDER:15
for n being Ordinal
for b being bag of n holds
( TotDegree b = 0 iff b = EmptyBag n )
proof end;

theorem Th15: :: BAGORDER:16
for i, j, n being Nat holds (i,j) -cut () = EmptyBag (j -' i)
proof end;

theorem Th16: :: BAGORDER:17
for i, j, n being Nat
for a, b being bag of n holds (i,j) -cut (a + b) = ((i,j) -cut a) + ((i,j) -cut b)
proof end;

theorem :: BAGORDER:18
canceled;

theorem :: BAGORDER:19
canceled;

::\$CT 2
theorem Th17: :: BAGORDER:20
for n, m being Ordinal
for b being bag of n st m in n holds
b | m is bag of m
proof end;

theorem :: BAGORDER:21
for n being set
for a, b being bag of n st b divides a holds
support b c= support a
proof end;

definition
let n be set ;
mode TermOrder of n is Order of (Bags n);
end;

notation
let n be Ordinal;
synonym LexOrder n for BagOrder n;
end;

definition
let n be Ordinal;
let T be TermOrder of n;
attr T is admissible means :Def5: :: BAGORDER:def 5
( T is_strongly_connected_in Bags n & ( for a being bag of n holds [(),a] in T ) & ( for a, b, c being bag of n st [a,b] in T holds
[(a + c),(b + c)] in T ) );
end;

:: deftheorem Def5 defines admissible BAGORDER:def 5 :
for n being Ordinal
for T being TermOrder of n holds
( T is admissible iff ( T is_strongly_connected_in Bags n & ( for a being bag of n holds [(),a] in T ) & ( for a, b, c being bag of n st [a,b] in T holds
[(a + c),(b + c)] in T ) ) );

theorem Th19: :: BAGORDER:22
for n being Ordinal holds LexOrder n is admissible
proof end;

registration
let n be Ordinal;
coherence by Th19;
end;

registration
let n be Ordinal;
existence
ex b1 being TermOrder of n st b1 is admissible
proof end;
end;

theorem :: BAGORDER:23
for o being infinite Ordinal holds not LexOrder o is well-ordering
proof end;

definition
let n be Ordinal;
func InvLexOrder n -> TermOrder of n means :Def6: :: BAGORDER:def 6
for p, q being bag of n holds
( [p,q] in it iff ( p = q or ex i being Ordinal st
( i in n & p . i < q . i & ( for k being Ordinal st i in k & k in n holds
p . k = q . k ) ) ) );
existence
ex b1 being TermOrder of n st
for p, q being bag of n holds
( [p,q] in b1 iff ( p = q or ex i being Ordinal st
( i in n & p . i < q . i & ( for k being Ordinal st i in k & k in n holds
p . k = q . k ) ) ) )
proof end;
uniqueness
for b1, b2 being TermOrder of n st ( for p, q being bag of n holds
( [p,q] in b1 iff ( p = q or ex i being Ordinal st
( i in n & p . i < q . i & ( for k being Ordinal st i in k & k in n holds
p . k = q . k ) ) ) ) ) & ( for p, q being bag of n holds
( [p,q] in b2 iff ( p = q or ex i being Ordinal st
( i in n & p . i < q . i & ( for k being Ordinal st i in k & k in n holds
p . k = q . k ) ) ) ) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def6 defines InvLexOrder BAGORDER:def 6 :
for n being Ordinal
for b2 being TermOrder of n holds
( b2 = InvLexOrder n iff for p, q being bag of n holds
( [p,q] in b2 iff ( p = q or ex i being Ordinal st
( i in n & p . i < q . i & ( for k being Ordinal st i in k & k in n holds
p . k = q . k ) ) ) ) );

theorem Th21: :: BAGORDER:24
for n being Ordinal holds InvLexOrder n is admissible
proof end;

registration
let n be Ordinal;
coherence by Th21;
end;

theorem Th22: :: BAGORDER:25
for o being Ordinal holds InvLexOrder o is well-ordering
proof end;

definition
let n be Ordinal;
let o be TermOrder of n;
assume A1: for a, b, c being bag of n st [a,b] in o holds
[(a + c),(b + c)] in o ;
func Graded o -> TermOrder of n means :Def7: :: BAGORDER:def 7
for a, b being bag of n holds
( [a,b] in it iff ( TotDegree a < TotDegree b or ( TotDegree a = TotDegree b & [a,b] in o ) ) );
existence
ex b1 being TermOrder of n st
for a, b being bag of n holds
( [a,b] in b1 iff ( TotDegree a < TotDegree b or ( TotDegree a = TotDegree b & [a,b] in o ) ) )
proof end;
uniqueness
for b1, b2 being TermOrder of n st ( for a, b being bag of n holds
( [a,b] in b1 iff ( TotDegree a < TotDegree b or ( TotDegree a = TotDegree b & [a,b] in o ) ) ) ) & ( for a, b being bag of n holds
( [a,b] in b2 iff ( TotDegree a < TotDegree b or ( TotDegree a = TotDegree b & [a,b] in o ) ) ) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def7 defines Graded BAGORDER:def 7 :
for n being Ordinal
for o being TermOrder of n st ( for a, b, c being bag of n st [a,b] in o holds
[(a + c),(b + c)] in o ) holds
for b3 being TermOrder of n holds
( b3 = Graded o iff for a, b being bag of n holds
( [a,b] in b3 iff ( TotDegree a < TotDegree b or ( TotDegree a = TotDegree b & [a,b] in o ) ) ) );

theorem Th23: :: BAGORDER:26
for n being Ordinal
for o being TermOrder of n st ( for a, b, c being bag of n st [a,b] in o holds
[(a + c),(b + c)] in o ) & o is_strongly_connected_in Bags n holds
proof end;

definition
let n be Ordinal;
func GrLexOrder n -> TermOrder of n equals :: BAGORDER:def 8
coherence
Graded () is TermOrder of n
;
func GrInvLexOrder n -> TermOrder of n equals :: BAGORDER:def 9
coherence
Graded () is TermOrder of n
;
end;

:: deftheorem defines GrLexOrder BAGORDER:def 8 :
for n being Ordinal holds GrLexOrder n = Graded ();

:: deftheorem defines GrInvLexOrder BAGORDER:def 9 :
for n being Ordinal holds GrInvLexOrder n = Graded ();

theorem Th24: :: BAGORDER:27
for n being Ordinal holds GrLexOrder n is admissible
proof end;

registration
let n be Ordinal;
coherence by Th24;
end;

theorem :: BAGORDER:28
for o being infinite Ordinal holds not GrLexOrder o is well-ordering
proof end;

theorem Th26: :: BAGORDER:29
for n being Ordinal holds GrInvLexOrder n is admissible
proof end;

registration
let n be Ordinal;
coherence by Th26;
end;

theorem :: BAGORDER:30
for o being Ordinal holds GrInvLexOrder o is well-ordering
proof end;

definition
let i, n be Nat;
let o1 be TermOrder of (i + 1);
let o2 be TermOrder of (n -' (i + 1));
func BlockOrder (i,n,o1,o2) -> TermOrder of n means :Def10: :: BAGORDER:def 10
for p, q being bag of n holds
( [p,q] in it iff ( ( (0,(i + 1)) -cut p <> (0,(i + 1)) -cut q & [((0,(i + 1)) -cut p),((0,(i + 1)) -cut q)] in o1 ) or ( (0,(i + 1)) -cut p = (0,(i + 1)) -cut q & [(((i + 1),n) -cut p),(((i + 1),n) -cut q)] in o2 ) ) );
existence
ex b1 being TermOrder of n st
for p, q being bag of n holds
( [p,q] in b1 iff ( ( (0,(i + 1)) -cut p <> (0,(i + 1)) -cut q & [((0,(i + 1)) -cut p),((0,(i + 1)) -cut q)] in o1 ) or ( (0,(i + 1)) -cut p = (0,(i + 1)) -cut q & [(((i + 1),n) -cut p),(((i + 1),n) -cut q)] in o2 ) ) )
proof end;
uniqueness
for b1, b2 being TermOrder of n st ( for p, q being bag of n holds
( [p,q] in b1 iff ( ( (0,(i + 1)) -cut p <> (0,(i + 1)) -cut q & [((0,(i + 1)) -cut p),((0,(i + 1)) -cut q)] in o1 ) or ( (0,(i + 1)) -cut p = (0,(i + 1)) -cut q & [(((i + 1),n) -cut p),(((i + 1),n) -cut q)] in o2 ) ) ) ) & ( for p, q being bag of n holds
( [p,q] in b2 iff ( ( (0,(i + 1)) -cut p <> (0,(i + 1)) -cut q & [((0,(i + 1)) -cut p),((0,(i + 1)) -cut q)] in o1 ) or ( (0,(i + 1)) -cut p = (0,(i + 1)) -cut q & [(((i + 1),n) -cut p),(((i + 1),n) -cut q)] in o2 ) ) ) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def10 defines BlockOrder BAGORDER:def 10 :
for i, n being Nat
for o1 being TermOrder of (i + 1)
for o2 being TermOrder of (n -' (i + 1))
for b5 being TermOrder of n holds
( b5 = BlockOrder (i,n,o1,o2) iff for p, q being bag of n holds
( [p,q] in b5 iff ( ( (0,(i + 1)) -cut p <> (0,(i + 1)) -cut q & [((0,(i + 1)) -cut p),((0,(i + 1)) -cut q)] in o1 ) or ( (0,(i + 1)) -cut p = (0,(i + 1)) -cut q & [(((i + 1),n) -cut p),(((i + 1),n) -cut q)] in o2 ) ) ) );

theorem :: BAGORDER:31
for i, n being Nat
for o1 being TermOrder of (i + 1)
for o2 being TermOrder of (n -' (i + 1)) st o1 is admissible & o2 is admissible holds
proof end;

definition
let n be Nat;
func NaivelyOrderedBags n -> strict RelStr means :Def11: :: BAGORDER:def 11
( the carrier of it = Bags n & ( for x, y being bag of n holds
( [x,y] in the InternalRel of it iff x divides y ) ) );
existence
ex b1 being strict RelStr st
( the carrier of b1 = Bags n & ( for x, y being bag of n holds
( [x,y] in the InternalRel of b1 iff x divides y ) ) )
proof end;
uniqueness
for b1, b2 being strict RelStr st the carrier of b1 = Bags n & ( for x, y being bag of n holds
( [x,y] in the InternalRel of b1 iff x divides y ) ) & the carrier of b2 = Bags n & ( for x, y being bag of n holds
( [x,y] in the InternalRel of b2 iff x divides y ) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def11 defines NaivelyOrderedBags BAGORDER:def 11 :
for n being Nat
for b2 being strict RelStr holds
( b2 = NaivelyOrderedBags n iff ( the carrier of b2 = Bags n & ( for x, y being bag of n holds
( [x,y] in the InternalRel of b2 iff x divides y ) ) ) );

theorem Th29: :: BAGORDER:32
for n being Nat holds the carrier of (product ()) = Bags n
proof end;

theorem Th30: :: BAGORDER:33
for n being Nat holds NaivelyOrderedBags n = product ()
proof end;

theorem :: BAGORDER:34
for n being Nat
for o being TermOrder of n st o is admissible holds
( the InternalRel of c= o & o is well-ordering )
proof end;

definition
let R be non empty connected Poset;
let X be Element of Fin the carrier of R;
assume A1: not X is empty ;
func PosetMin X -> Element of R means :: BAGORDER:def 12
( it in X & it is_minimal_wrt X, the InternalRel of R );
existence
ex b1 being Element of R st
( b1 in X & b1 is_minimal_wrt X, the InternalRel of R )
proof end;
uniqueness
for b1, b2 being Element of R st b1 in X & b1 is_minimal_wrt X, the InternalRel of R & b2 in X & b2 is_minimal_wrt X, the InternalRel of R holds
b1 = b2
proof end;
func PosetMax X -> Element of R means :Def13: :: BAGORDER:def 13
( it in X & it is_maximal_wrt X, the InternalRel of R );
existence
ex b1 being Element of R st
( b1 in X & b1 is_maximal_wrt X, the InternalRel of R )
proof end;
uniqueness
for b1, b2 being Element of R st b1 in X & b1 is_maximal_wrt X, the InternalRel of R & b2 in X & b2 is_maximal_wrt X, the InternalRel of R holds
b1 = b2
proof end;
end;

:: deftheorem defines PosetMin BAGORDER:def 12 :
for R being non empty connected Poset
for X being Element of Fin the carrier of R st not X is empty holds
for b3 being Element of R holds
( b3 = PosetMin X iff ( b3 in X & b3 is_minimal_wrt X, the InternalRel of R ) );

:: deftheorem Def13 defines PosetMax BAGORDER:def 13 :
for R being non empty connected Poset
for X being Element of Fin the carrier of R st not X is empty holds
for b3 being Element of R holds
( b3 = PosetMax X iff ( b3 in X & b3 is_maximal_wrt X, the InternalRel of R ) );

definition
let R be non empty connected Poset;
func FinOrd-Approx R -> sequence of (bool [:(Fin the carrier of R),(Fin the carrier of R):]) means :Def14: :: BAGORDER:def 14
( dom it = NAT & it . 0 = { [x,y] where x, y is Element of Fin the carrier of R : ( x = {} or ( x <> {} & y <> {} & PosetMax x <> PosetMax y & [(),()] in the InternalRel of R ) ) } & ( for n being Nat holds it . (n + 1) = { [x,y] where x, y is Element of Fin the carrier of R : ( x <> {} & y <> {} & PosetMax x = PosetMax y & [(x \ {()}),(y \ {()})] in it . n ) } ) );
existence
ex b1 being sequence of (bool [:(Fin the carrier of R),(Fin the carrier of R):]) st
( dom b1 = NAT & b1 . 0 = { [x,y] where x, y is Element of Fin the carrier of R : ( x = {} or ( x <> {} & y <> {} & PosetMax x <> PosetMax y & [(),()] in the InternalRel of R ) ) } & ( for n being Nat holds b1 . (n + 1) = { [x,y] where x, y is Element of Fin the carrier of R : ( x <> {} & y <> {} & PosetMax x = PosetMax y & [(x \ {()}),(y \ {()})] in b1 . n ) } ) )
proof end;
uniqueness
for b1, b2 being sequence of (bool [:(Fin the carrier of R),(Fin the carrier of R):]) st dom b1 = NAT & b1 . 0 = { [x,y] where x, y is Element of Fin the carrier of R : ( x = {} or ( x <> {} & y <> {} & PosetMax x <> PosetMax y & [(),()] in the InternalRel of R ) ) } & ( for n being Nat holds b1 . (n + 1) = { [x,y] where x, y is Element of Fin the carrier of R : ( x <> {} & y <> {} & PosetMax x = PosetMax y & [(x \ {()}),(y \ {()})] in b1 . n ) } ) & dom b2 = NAT & b2 . 0 = { [x,y] where x, y is Element of Fin the carrier of R : ( x = {} or ( x <> {} & y <> {} & PosetMax x <> PosetMax y & [(),()] in the InternalRel of R ) ) } & ( for n being Nat holds b2 . (n + 1) = { [x,y] where x, y is Element of Fin the carrier of R : ( x <> {} & y <> {} & PosetMax x = PosetMax y & [(x \ {()}),(y \ {()})] in b2 . n ) } ) holds
b1 = b2
proof end;
end;

:: deftheorem Def14 defines FinOrd-Approx BAGORDER:def 14 :
for R being non empty connected Poset
for b2 being sequence of (bool [:(Fin the carrier of R),(Fin the carrier of R):]) holds
( b2 = FinOrd-Approx R iff ( dom b2 = NAT & b2 . 0 = { [x,y] where x, y is Element of Fin the carrier of R : ( x = {} or ( x <> {} & y <> {} & PosetMax x <> PosetMax y & [(),()] in the InternalRel of R ) ) } & ( for n being Nat holds b2 . (n + 1) = { [x,y] where x, y is Element of Fin the carrier of R : ( x <> {} & y <> {} & PosetMax x = PosetMax y & [(x \ {()}),(y \ {()})] in b2 . n ) } ) ) );

theorem Th32: :: BAGORDER:35
for R being non empty connected Poset
for x, y being Element of Fin the carrier of R holds
( [x,y] in union (rng ()) iff ( x = {} or ( x <> {} & y <> {} & PosetMax x <> PosetMax y & [(),()] in the InternalRel of R ) or ( x <> {} & y <> {} & PosetMax x = PosetMax y & [(x \ {()}),(y \ {()})] in union (rng ()) ) ) )
proof end;

theorem Th33: :: BAGORDER:36
for R being non empty connected Poset
for x being Element of Fin the carrier of R st x <> {} holds
not [x,{}] in union (rng ())
proof end;

theorem Th34: :: BAGORDER:37
for R being non empty connected Poset
for a being Element of Fin the carrier of R holds a \ {()} is Element of Fin the carrier of R
proof end;

Lm1: for R being non empty connected Poset
for n being Nat
for a being Element of Fin the carrier of R st card a = n + 1 holds
card (a \ {()}) = n

proof end;

theorem Th35: :: BAGORDER:38
for R being non empty connected Poset holds union (rng ()) is Order of (Fin the carrier of R)
proof end;

definition
let R be non empty connected Poset;
func FinOrd R -> Order of (Fin the carrier of R) equals :: BAGORDER:def 15
union (rng ());
coherence
union (rng ()) is Order of (Fin the carrier of R)
by Th35;
end;

:: deftheorem defines FinOrd BAGORDER:def 15 :
for R being non empty connected Poset holds FinOrd R = union (rng ());

definition
let R be non empty connected Poset;
func FinPoset R -> Poset equals :: BAGORDER:def 16
RelStr(# (Fin the carrier of R),() #);
correctness
coherence
RelStr(# (Fin the carrier of R),() #) is Poset
;
;
end;

:: deftheorem defines FinPoset BAGORDER:def 16 :
for R being non empty connected Poset holds FinPoset R = RelStr(# (Fin the carrier of R),() #);

registration
let R be non empty connected Poset;
cluster FinPoset R -> non empty ;
correctness
coherence
not FinPoset R is empty
;
;
end;

theorem Th36: :: BAGORDER:39
for R being non empty connected Poset
for a, b being Element of () holds
( [a,b] in the InternalRel of () iff ex x, y being Element of Fin the carrier of R st
( a = x & b = y & ( x = {} or ( x <> {} & y <> {} & PosetMax x <> PosetMax y & [(),()] in the InternalRel of R ) or ( x <> {} & y <> {} & PosetMax x = PosetMax y & [(x \ {()}),(y \ {()})] in FinOrd R ) ) ) )
proof end;

registration
let R be non empty connected Poset;
correctness
coherence ;
proof end;
end;

definition
let R be non empty connected RelStr ;
let C be non empty set ;
assume that
A1: R is well_founded and
A2: C c= the carrier of R ;
func MinElement (C,R) -> Element of R means :Def17: :: BAGORDER:def 17
( it in C & it is_minimal_wrt C, the InternalRel of R );
existence
ex b1 being Element of R st
( b1 in C & b1 is_minimal_wrt C, the InternalRel of R )
proof end;
uniqueness
for b1, b2 being Element of R st b1 in C & b1 is_minimal_wrt C, the InternalRel of R & b2 in C & b2 is_minimal_wrt C, the InternalRel of R holds
b1 = b2
proof end;
end;

:: deftheorem Def17 defines MinElement BAGORDER:def 17 :
for R being non empty connected RelStr
for C being non empty set st R is well_founded & C c= the carrier of R holds
for b3 being Element of R holds
( b3 = MinElement (C,R) iff ( b3 in C & b3 is_minimal_wrt C, the InternalRel of R ) );

theorem Th37: :: BAGORDER:40
for R being non empty RelStr
for s being sequence of R
for j being Nat st s is descending holds
s ^\ j is descending
proof end;

theorem :: BAGORDER:41
for R being non empty connected Poset st R is well_founded holds
FinPoset R is well_founded
proof end;