Library Coq.Wellfounded.Lexicographic_Exponentiation
Author: Cristina Cornes
From : Constructing Recursion Operators in Type Theory L. Paulson JSC (1986) 2, 325-355
Require
Import
List
.
Require
Import
Relation_Operators
.
Require
Import
Transitive_Closure
.
Section
Wf_Lexicographic_Exponentiation
.
Variable
A
:
Set
.
Variable
leA
:
A
->
A
->
Prop
.
Notation
Power
:= (
Pow
A
leA
).
Notation
Lex_Exp
:= (
lex_exp
A
leA
).
Notation
ltl
:= (
Ltl
A
leA
).
Notation
Descl
:= (
Desc
A
leA
).
Notation
List
:= (
list
A
).
Notation
Nil
:= (
nil
(
A
:=
A
)).
Notation
Cons
:= (
cons
(
A
:=
A
)).
Notation
"
<< x , y >>" := (
exist
Descl
x
y
) (
at
level
0,
x
,
y
at
level
100).
Lemma
left_prefix
:
forall
x
y
z
:
List
,
ltl
(
x
++
y
)
z
->
ltl
x
z
.
Lemma
right_prefix
:
forall
x
y
z
:
List
,
ltl
x
(
y
++
z
) ->
ltl
x
y
\/
(
exists
y´
:
List
,
x
=
y
++
y´
/\
ltl
y´
z
)
.
Lemma
desc_prefix
:
forall
(
x
:
List
) (
a
:
A
),
Descl
(
x
++
Cons
a
Nil
) ->
Descl
x
.
Lemma
desc_tail
:
forall
(
x
:
List
) (
a
b
:
A
),
Descl
(
Cons
b
(
x
++
Cons
a
Nil
)) ->
clos_trans
A
leA
a
b
.
Lemma
dist_aux
:
forall
z
:
List
,
Descl
z
->
forall
x
y
:
List
,
z
=
x
++
y
->
Descl
x
/\
Descl
y
.
Lemma
dist_Desc_concat
:
forall
x
y
:
List
,
Descl
(
x
++
y
) ->
Descl
x
/\
Descl
y
.
Lemma
desc_end
:
forall
(
a
b
:
A
) (
x
:
List
),
Descl
(
x
++
Cons
a
Nil
)
/\
ltl
(
x
++
Cons
a
Nil
) (
Cons
b
Nil
) ->
clos_trans
A
leA
a
b
.
Lemma
ltl_unit
:
forall
(
x
:
List
) (
a
b
:
A
),
Descl
(
x
++
Cons
a
Nil
) ->
ltl
(
x
++
Cons
a
Nil
) (
Cons
b
Nil
) ->
ltl
x
(
Cons
b
Nil
).
Lemma
acc_app
:
forall
(
x1
x2
:
List
) (
y1
:
Descl
(
x1
++
x2
)),
Acc
Lex_Exp
<<
x1
++
x2
,
y1
>>
->
forall
(
x
:
List
) (
y
:
Descl
x
),
ltl
x
(
x1
++
x2
) ->
Acc
Lex_Exp
<<
x
,
y
>>
.
Theorem
wf_lex_exp
:
well_founded
leA
->
well_founded
Lex_Exp
.
End
Wf_Lexicographic_Exponentiation
.