рдЖрд░реНрдЯреЗрдВрдб рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ
рдореЗрдВ рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ , рд╣рдордиреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЖрдЧрдордирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ, рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдпреЛрдВ, рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╕реЗрдЯреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреАред
2. Arend рдореЗрдВ рдХреНрд░рдордмрджреНрдз рд╕реВрдЪреА
2.1 Arend рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╕реВрдЪрд┐рдпрд╛рдБ
рд╣рдо рдПрдХ рдЬреЛрдбрд╝реА рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд░рдордмрджреНрдз рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕реВрдЪреА рдФрд░ рдЙрд╕рдХреЗ рдХреНрд░рдо рдХрд╛ рдкреНрд░рдорд╛рдг рд╣реЛрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рд╣реИ, Arend рдореЗрдВ, рдирд┐рд░реНрднрд░ рдЬреЛрдбрд╝реЗ рдХреЛ the
\Sigma
рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдирдореВрдиреЗ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
Sorted
рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рджреЗрддреЗ рд╣реИрдВ,
рдЖрджреЗрд╢рд┐рдд рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЙрд▓реНрд▓реЗрдЦрд┐рдд
рд▓реЗрдЦ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИ
ред \func SortedList (O : LinearOrder.Dec) => \Sigma (l : List O) (Sorted l) \data Sorted {A : LinearOrder.Dec} (xs : List A) \elim xs | nil => nilSorted | :-: x nil => singletonSorted | :-: x1 (:-: x2 xs) => consSorted ((x1 = x2) || (x1 < x2)) (Sorted (x2 :-: xs))
рдиреЛрдЯ: Arend рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдХрд┐
Sorted
рдкреНрд░рдХрд╛рд░
\Prop
рдмреНрд░рд╣реНрдорд╛рдВрдб рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐
Sorted
рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рд╕рднреА рддреАрди рдкреИрдЯрд░реНрди рдкрд░рд╕реНрдкрд░ рдЕрдирдиреНрдп рд╣реИрдВ, рдФрд░
consSorted
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рджреЛрдиреЛрдВ рдХрд╛ рд╕рдВрдмрдВрдз
\Prop
ред
рд╣рдореЗрдВ
Sorted
рд╡рд┐рдзреЗрдп рдХреА рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдкрддреНрддрд┐ рд╕рд╛рдмрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдСрд░реНрдбрд░ рдХреА рдЧрдИ рд╕реВрдЪреА рдХреА рдкреВрдВрдЫ рдЦреБрдж рдПрдХ рдСрд░реНрдбрд░ рдХреА рдЧрдИ рд╕реВрдЪреА рд╣реИ (рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреА)ред
\func tail-sorted {O : LinearOrder.Dec} (x : O) (xs : List O) (A : Sorted (x :-: xs)) : Sorted xs \elim xs, A | nil, _ => nilSorted | :-: _ _, consSorted _ xs-sorted => xs-sorted
tail-sorted
рд╣рдордиреЗ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ
xs
рд╕реВрдЪреА рдФрд░
Sorted
рд╡рд┐рдзреЗрдп рдкрд░ рдорд┐рд▓рд╛рди рд╡рд╛рд▓реЗ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдордиреЗ "_"
рд╕реНрдХрд┐рдк рд╡рд░реНрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ , рдЬрд┐рд╕реЗ рдЕрдкреНрд░рдпреБрдХреНрдд рдЪрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреЛрдИ рдкреВрдЫ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрд░реНрдиреЗрдВрдб рдореЗрдВ рдЖрджреЗрд╢рд┐рдд рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдзрд╛рд░рд╛ 1.3 рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдПрдХ рддрдереНрдп рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рдмрд┐рдирд╛ рд╕рд╛рд░ рдХреЗ рдЕрдирд╛рдЙрдВрд╕рдореЗрдВрдЯ рдХреЗ рдПрдЬрдбрд╛ рдореЗрдВ рд╕рд╛рдмрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕реНрдорд░рдг рдХрд░реЛ рдХрд┐ рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рджрд╛рд╡рд╛ рдХрд░рддреА рд╣реИ рдХрд┐ рдирд┐рд░реНрднрд░ рдЬреЛрдбрд╝реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЖрджреЗрд╢ рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рд╕рдорд╛рдирддрд╛ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЬреЛрдбрд╝реЗ рдХреЗ рдкрд╣рд▓реЗ рдШрдЯрдХреЛрдВ рдХреА рд╕рдорд╛рдирддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдпрд╣ рддрд░реНрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ Arend рдореЗрдВ рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рдЙрдкрд░реНрдпреБрдХреНрдд рдЙрд▓реНрд▓рд┐рдЦрд┐рдд
inProp
рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЖрд╢реНрд░рд┐рдд
SigmaExt
рдЬреЛрдбрд╝реЗ рдХреЗ рд▓рд┐рдП
SigmaExt
рд╕рдВрдкрддреНрддрд┐ рдХрд╛
SigmaExt
ред
\func sorted-equality {A : LinearOrder.Dec} (l1 l2 : SortedList A) (P : l1.1 = l2.1) : l1 = l2 => SigmaPropExt Sorted l1 l2 P
SigmaPropExt
рд╕рдВрдкрддреНрддрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ
рдкрде рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕рд╛рдмрд┐рдд рд╣реЛрддреА рд╣реИ, рдФрд░
HoTT рдкреБрд╕реНрддрдХ рдХреЗ рджреВрд╕рд░реЗ рдЕрдзреНрдпрд╛рдп рд╕реЗ рдХрдИ рдЕрдиреНрдп рддрдереНрдп, рдЬрд┐рд╕рдореЗрдВ
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдмрд╣реБрдЖрдпрд╛рдореА рдХреА
рд╕рдВрдкрддреНрддрд┐ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рд╕рд┐рджреНрдз рд╣реЛрддреЗ рд╣реИрдВред
.n
рдСрдкрд░реЗрдЯрд░
.n
рдЙрдкрдпреЛрдЧ Arend рдореЗрдВ рд╕рд┐рдЧреНрдорд╛ рдЯрд╛рдЗрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯрд░ рдХреЛ рдирдВрдмрд░ n (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд┐рдЧреНрдорд╛ рдЯрд╛рдЗрдк
SortedList A
рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди
l1.1
рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд╣рд▓рд╛ рдШрдЯрдХ рдЯрд╛рдЗрдк
List A
рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ)ред
2.2 "рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди" рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЕрдм рдЖрдЗрдП Arend рдкрд░ рд╕реВрдЪреА рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдо рдЫрдБрдЯрд╛рдИ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЧреБрдгреЛрдВ рдХреЗ рдкреНрд░рдорд╛рдг рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдХрдо рд╕реЗ рдХрдо 2 рдЧреБрдг рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП:
1. рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдЖрджреЗрд╢рд┐рдд рд╕реВрдЪреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
2. рдкрд░рд┐рдгрд╛рдореА рд╕реВрдЪреА рдХреЛ рдореВрд▓ рд╕реВрдЪреА рдХрд╛ рдХреНрд░рдордЪрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкрд╣рд▓реЗ, рдЖрдЗрдП, Arend рдкрд░ рд╕реВрдЪрд┐рдпреЛрдВ рдХреА "рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди" рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо Arend рдХреЗ рд▓рд┐рдП
рдпрд╣рд╛рдБ рд╕реЗ рд▓реА рдЧрдИ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЕрдкрдирд╛рддреЗ рд╣реИрдВред
\truncated \data InsertSpec {A : \Set} (xs : List A) (a : A) (ys : List A) : \Prop \elim xs, ys | xs, :-: y ys => insertedHere (a = y) (xs = ys) | :-: x xs, :-: y ys => insertedThere (x = y) (InsertSpec xs a ys) \truncated \data Perm {A : \Set} (xs ys : List A) : \Prop | permInsert (xs' ys' : List A) (a : A) (Perm xs' ys') (InsertSpec xs' a xs) (InsertSpec ys' a ys) | permTrivial (xs = ys)
рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХреА рдЧрдИ
InsertSpec
рд╡рд┐рдзреЗрдп рдХрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╣рдЬ рдЕрд░реНрде рд╣реИ:
InsertSpec xs a ys
рдареАрдХ-рдареАрдХ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕реВрдЪреА
ys
рддрддреНрд╡ рдХреЛ рд╕реВрдЪреА
xs
(рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ) рдХреЗ рдЕрдВрджрд░ рдбрд╛рд▓рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░,
InsertSpec
рд╕рдореНрдорд┐рд▓рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐
Perm
рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди" рд╕рдВрдмрдВрдз рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:
permInsert
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
permInsert
рд╣реИ рдХрд┐ рдпрджрд┐
xs
рдФрд░
ys
рдХреЛ рдХреБрдЫ рд▓рд┐рд╕реНрдЯ
xs'
рдФрд░
ys'
рдореЗрдВ рдПрдХ рд╣реА рддрддреНрд╡ рдбрд╛рд▓рдиреЗ рдкрд░
xs
рдФрд░
ys
рдкрд░рд╕реНрдкрд░
permInsert
рд╣реИрдВред
ys'
рдЫреЛрдЯреА рд▓рдВрдмрд╛рдИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВред
рд╣рдорд╛рд░реЗ "рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди" рд╕рдВрдкрддреНрддрд┐ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП, рд╕рдорд░реВрдкрддрд╛ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
\func Perm-symmetric {A : \Set} {xs ys : List A} (P : Perm xs ys) : Perm ys xs \elim P | permTrivial xs=ys => permTrivial (inv xs=ys) | permInsert perm-xs'-ys' xs-spec ys-spec => permInsert (Perm-symmetric perm-xs'-ys') ys-spec xs-spec
рдкрд░реНрдорд┐рдЯреЗрд╢рди рдкреНрд░реЙрдкрд░реНрдЯреА рднреА
Perm
рд▓рд┐рдП рд╕рдВрддреБрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдЪреВрдВрдХрд┐ рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рд╣рдорд╛рд░реЗ рдЫрдВрдЯрд╛рдИ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреЛрдИ рднреВрдорд┐рдХрд╛ рдирд╣реАрдВ рдирд┐рднрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рдардХ рдкрд░ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред
\func Perm-transitive {A : \Set} (xs ys zs : List A) (P1 : Perm xs ys) (P2 : Perm ys zs) : Perm xs zs => {?}
2.3 рдирдореВрдиреЗ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдкрд░ рд╣реЛрдореЛрдЯреЙрдкреНрдЯреА рдХреЗ рд╕реНрддрд░ рдореЗрдВ рдмрджрд▓рд╛рд╡
рдЕрдм рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рддрддреНрд╡ рдХреЛ рдПрдХ рдЖрджреЗрд╢рд┐рдд рд╕реВрдЪреА рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкрд░рд┐рдгрд╛рдореА рд╕реВрдЪреА рдЖрджреЗрд╢рд┐рдд рд░рд╣реЗред рдЖрдЗрдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднреЛрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВред
\func insert {O : LinearOrder.Dec} (xs : List O) (y : O) : List O \elim xs | nil => y :-: nil | :-: x xs' => \case LinearOrder.trichotomy xy \with { | byLeft x=y => x :-: insert xs' y | byRight (byLeft x<y) => x :-: insert xs' y | byRight (byRight y<x) => y :-: x :-: xs' }
\case
рдирд┐рд░реНрдорд╛рдг, рдПрдХ рдордирдорд╛рдирд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдирдореВрдиреЗ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (
\elim
рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЙрдЪреНрдЪрддрдо рд╕реНрддрд░ рдкрд░ рдФрд░ рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдпрджрд┐ рдЖрдк
insert
рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Arend рд╕реЗ рдкреВрдЫрддреЗ рд╣реИрдВ, рддреЛ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛ред
[ERROR] Data type '||' is truncated to the universe \Prop which does not fit in the universe of the eliminator type: List OE In: | byLeft x-leq-y => x :-: insert xs' y While processing: insert
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐
LinearOrder.Dec
рд╡рд░реНрдЧ рдореЗрдВ
LinearOrder.Dec
рдкрд░рд┐рднрд╛рд╖рд╛
LinearOrder.Dec
рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреА рдЧрдИ рд╣реИ
||
, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдкреНрд░рдкреЛрдЬрд▓ рдЯреНрд░рдВрдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ,
\Prop
рдмреНрд░рд╣реНрдорд╛рдВрдб рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, Arend рдореЗрдВ рдПрдХ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рди рдХреА рдЕрдиреБрдорддрд┐ рдХреЗрд╡рд▓ рддрднреА рджреА рдЬрд╛рддреА рд╣реИ рдЬрдм рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рдпрдВ рдПрдХ рдЕрднрд┐рдХрдерди рд╣реЛ (рдКрдкрд░ рджрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░
List OE
, рдФрд░ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕реЗрдЯ рд╣реИ)ред
рдХреНрдпрд╛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рд╣реИ? рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЯреНрд░рд╛рдЗрдХреЛрдЯреЙрдореА рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдмрджрд▓рдирд╛ рд╣реИред рдЯреНрд░рд┐рдХреЛрдЯреЙрдореА рдХреА рдирд┐рдореНрди рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдмрд┐рдирд╛-рдХреНрд░рдВрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
Or
рдЯреНрд░рдВрдХрд┐рдд рдХреЗ рдмрдЬрд╛рдп
||
:
\func set-trichotomy {A : StrictPoset} (xy : A) => ((x = y) `Or` (x < y)) `Or` (y < x)
рдХреНрдпрд╛ рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рдореВрд▓
trichotomy
рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдореЗрдВ
trichotomy
рд╣реИ
||
? рдЕрдЧрд░ рд╣рдо рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рдЬреАрд╡рди рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдордиреЗ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛?
рдЖрдЗрдП рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ: рд╕рдЦреНрдд
StrictPoset
рдЖрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП
StrictPoset
рдФрд░
set-trichotomy
StrictPoset
рдмреАрдЪ
StrictPoset
рдЕрдВрддрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
set-trichotomy
рдкреНрд░рдХрд╛рд░ рдПрдХ рдмрдпрд╛рди рд╣реИред рдпрд╣ рддрдереНрдп рдЗрд╕ рддрдереНрдп рд╕реЗ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЯреНрд░рд╛рдЗрдХреЛрдЯреЙрдореА рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рд╕рднреА рддреАрди рд╡рд┐рдХрд▓реНрдк рдХреНрд░рдо рдХреЗ рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдз рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдирдиреНрдп рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ
x = y, x < y, y < x
рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдХрдерди рд╣реИ (
x = y
рдПрдХ рдХрдерди рд╣реИ, рдЗрд╕рд▓рд┐рдП
BaseSet
рдХреНрд▓рд╛рд╕ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ
BaseSet
рд╣рдордиреЗ рдорд╛рдВрдЧ рдХреА рдХрд┐ рдореАрдбрд┐рдпрд╛
E
рдПрдХ рд╕реЗрдЯ рд╣реЛ!)ред
\func set-trichotomy-isProp {A : StrictPoset} (xy : A) (l1 l2 : set-trichotomy xy): l1 = l2 \elim l1, l2 | inl (inl l1), inl (inl l2) => pmap (\lam z => inl (inl z)) (Path.inProp l1 l2) | inl (inr l1), inl (inr l2) => pmap (\lam z => inl (inr z)) (Path.inProp l1 l2) | inr l1, inr l2 => pmap inr (Path.inProp l1 l2) | inl (inl l1), inl (inr l2) => absurd (lt-eq-false l1 l2) | inl (inr l1), inl (inl l2) => absurd (lt-eq-false l2 l1) | inl (inl l1), inr l2 => absurd (lt-eq-false (inv l1) l2) | inr l1, inl (inl l2) => absurd (lt-eq-false (inv l2) l1) | inl (inr l1), inr l2 => absurd (lt-lt-false l1 l2) | inr l1, inl (inr l2) => absurd (lt-lt-false l2 l1) \where { \func lt-eq-false {A : StrictPoset} {xy : A} (l1 : x = y) (l2 : x < y) : Empty => A.<-irreflexive x (transport (x <) (inv l1) l2) \func lt-lt-false {A : StrictPoset} {xy : A} (l1 : x < y) (l2 : y < x) : Empty => A.<-irreflexive x (A.<-transitive _ _ _ l1 l2) }
рдКрдкрд░ рдХреА рд╕реВрдЪреА рдореЗрдВ,
absurd
рдПрдХреНрд╕ рдлреЙрд▓реНрд╕реЛ рдХреНрд╡реЙрдбрд▓рд┐рдмреЗрдЯ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд▓рд┐рдП рдкрджрдирд╛рдо рд╣реИ, рдЬрд┐рд╕реЗ
рддрд░реНрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЪреВрдВрдХрд┐
Empty
рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдирд╣реАрдВ рд╣реИрдВ (рдЕрдиреБрднрд╛рдЧ 1.2 рджреЗрдЦреЗрдВ),
absurd
рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ:
\func absurd {A : \Type} (x : Empty) : A
рдЪреВрдВрдХрд┐ рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐
set-trichotomy
рдПрдХ рдмрдпрд╛рди рд╣реИ, рд╣рдо
set-trichotomy
рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдЖрджреЗрд╢реЛрдВ рдХреА рд╕рд╛рдорд╛рдиреНрдп
trichotomy
рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
\return \level
рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ Arend рдЯрд╛рдЗрдорд░ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рди рдПрдХ рдЕрдиреБрдордд рдСрдкрд░реЗрд╢рди рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рд╕рдмреВрдд рджрд┐рдЦрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐
set-trichotomy-property
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдмрдпрд╛рди рд╣реИ)ред
\func set-trichotomy-property {A : LinearOrder.Dec} (xy : A) : set-trichotomy xy => \case A.trichotomy xy \return \level (set-trichotomy xy) (set-trichotomy-isProp xy) \with { | byLeft x=y => inl (inl x=y) | byRight (byLeft x<y) => inl (inr x<y) | byRight (byRight y<x) => inr (y<x) }
рдЖрдЗрдП рдЕрдм рд╣рдо рджреВрд╕рд░реЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рдХреНрдпреЛрдВ, рдЧрдгрд┐рддреАрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдЯреЗ рдЧрдП рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЧреИрд░-рд░реИрдЦрд┐рдХ рд░реИрдЦрд┐рдХ рдЖрджреЗрд╢реЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (рд░реИрдЦрд┐рдХ рдФрд░
TotalOrder
рдХреА рдкреВрд░реА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ
рд░реИрдЦрд┐рдХрдСрд░реНрдбрд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ):
\class TotalOrder \extends Lattice { | totality (xy : E) : x <= y || y <= x }
рдЖрдЗрдП рдЕрдм рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдЕрдЧрд░ рд╣рдордиреЗ рд╕рдВрдпреБрдХреНрдд рд░рд╛рд╖реНрдЯреНрд░ рдХреЗ рдХреБрд▓-рдХреНрд╖реЗрддреНрд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЕрди-рдЯреНрд░реБрдиреЗрдЯреЗрдб
Or
рдирд┐рд░реНрдорд╛рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ рддреЛ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдХреИрд╕реЗ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред
\class BadTotalOrder \extends Lattice { | badTotality (xy : E) : (x <= y) `Or` (y <= x) }
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЯрд╛рдЗрдк
(x <= y) `Or` (y <= x)
рдЕрдм рдПрдХ рдмрдпрд╛рди рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐
x
рдФрд░
y
рдХреЗ рд╕рдорд╛рди рдореВрд▓реНрдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ
y
badTotality
рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░
badTotality
рдХреЗ рдкреНрд░рдорд╛рдг рдореЗрдВ рдмрд╛рдПрдВ рдпрд╛ рджрд╛рдПрдВ рд╢рд╛рдЦрд╛ рдХрд╛
badTotality
рдмрд┐рд▓реНрдХреБрд▓ рдордирдорд╛рдирд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╡рд┐рд╡реЗрдХ рдкрд░ рд░рд╣рддрд╛ рд╣реИред рдПрдХ
Or
рджреВрд╕рд░реЗ рдХреЛ рдкрд╕рдВрдж рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред
рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐
TotalOrder
рдФрд░
BadTotalOrder
рдХреНрдпрд╛ рдЕрдВрддрд░
BadTotalOrder
ред рджреЛ рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рд╕реЗрдЯ
O1 O2
:
TotalOrder
рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рд╕реЗрдЯ
O1.E, O2.E
рдФрд░ рдСрд░реНрдбрд░
O1.<, O2.<
рдХреА рд╕рдорд╛рдирддрд╛ рд╕рд╛рдмрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрддрд╛ рд╣реИ
O1.<, O2.<
рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрддреЗ рд╣реБрдП (рдпрд╣ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдкрддреНрддрд┐ рд╣реИ)ред рджреВрд╕рд░реА рдУрд░,
O1 O2
:
BadTotalOrder
рдХреЗрд╡рд▓
O1
рдФрд░
O2
рдХреА рд╕рдорд╛рдирддрд╛ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░рдирд╛
BadTotalOrder
рд╣реИ, рдЬрдм
E
рд╕реЗ рд╕рднреА рддрддреНрд╡реЛрдВ
x
рдЕрд▓рд╛рд╡рд╛
E
рд╕рдорд╛рдирддрд╛
O1.badTotality xx
рдФрд░
O2.badTotality xx
ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рд╕
BadTotalOrder
рд╕рд╣рдЬ рд░реВрдк рд╕реЗ "рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдЖрджреЗрд╢рд┐рдд рд╕реЗрдЯ" рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдПрдХ "рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдЖрджреЗрд╢рд┐рдд рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдмрд╛рдПрдВ рдпрд╛ рджрд╛рдПрдВ
x
рдХреНрд╖реЗрддреНрд░
E
рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡
x
рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде
Or
badTotality xx
рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ"ред
реи.рек рд╕реЙрд░реНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо
рдЕрдм рд╣рдо рдЫрдБрдЯрд╛рдИ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдЖрдЗрдП, рд╕рд┐рджреНрдз
set-trichotomy-property
(рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ,
set-trichotomy
рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрд╖реНрдардХ рдХреА рдЕрдзрд┐рдХ рд╕рдлрд▓ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рдХрд╛рд░рдг, рд╣рдордиреЗ рдорд╛рдирд╛ рдорд╛рдорд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рдХрд░ рджреА рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рд╕реЗ
insert
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреЛрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
\func insert {O : LinearOrder.Dec} (xs : List O) (y : O) : List O \elim xs | nil => y :-: nil | :-: x xs' => \case set-trichotomy-property xy \with { | inr y<x => y :-: x :-: xs' | inl x<=y => x :-: insert xs' y }
рдЕрдм рдЖрдЗрдП рд╕реВрдЪреАрдмрджреНрдз рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╣рдо рдирд┐рд░реНрдорд╛рдг
\let тАж \in
рд╡рд┐рд╢реЗрд╖
\let тАж \in
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╣рдореЗрдВ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирдП рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
\func insert {O : LinearOrder.Dec} (xs : SortedList O) (y : O) : SortedList O \elim xs | (nil, _) => (y :-: nil, singletonSorted) | (:-: x xs', xs-sorted) => \case set-trichotomy-property xy \with { | inr y<x => (y :-: x :-: xs', consSorted (byRight y<x) xs-sorted) | inl x<=y => \let (result, result-sorted) => insert (xs', tail-sorted x xs' xs-sorted) y \in (x :-: result, {?})
рд╣рдо рдкреНрд░рдорд╛рдг рдореЗрдВ рдПрдХ рдЕрдкреВрд░реНрдг рдЯреБрдХрдбрд╝рд╛ (рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд
{?}
) рдореЗрдВ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рдЬрд╣рд╛рдВ рдЖрдк рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕реВрдЪреА
x :-: result
рдЖрджреЗрд╢ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╕рдВрджрд░реНрдн рдореЗрдВ
result
рд╕реВрдЪреА рдХреЗ рдХреНрд░рдо рдХреЗ рд╕рд╛рдХреНрд╖реНрдп рд╣реИрдВ, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдХрд┐
x
result
рд╕реВрдЪреА рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЗ рдореВрд▓реНрдп рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрд░рд┐рд╕рд░ рд╕реЗ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ (рд╡рд░реНрддрдорд╛рди рд▓рдХреНрд╖реНрдп рдореЗрдВ рд╕рднреА рдкрд░рд┐рд╕рд░реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП - рдпрд╣ рд╡рд╣реА рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдЧрдгрдирд╛ рдХреА рд╡рд░реНрддрдорд╛рди рд╢рд╛рдЦрд╛ - рдЖрдкрдХреЛ
insert
рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред
рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐
insert
рд▓рд╛рдЧреВ
insert
рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдпрджрд┐ рд╣рдо
insert
рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдкреНрд░рдорд╛рдг рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдореА рд╕реВрдЪреА рдХреЗ рдХреНрд░рдо рдХреЛ рд╕рд┐рджреНрдз рдХрд░рддреЗ рд╣реИрдВред
insert
рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрджрд▓реЗрдВ рдФрд░ рд╕рд░рд▓рддрдо рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкреНрд░рдорд╛рдг рд▓рд┐рдЦреЗрдВ:
\func insert {O : LinearOrder.Dec} (xs : SortedList O) (y : O) : \Sigma (ys : SortedList O) (InsertSpec xs.1 y ys.1) \elim xs | (nil, _) => ((y :-: nil, singletonSorted), insertedHere idp idp) | (:-: x xs', xs-sorted) => \case set-trichotomy-property xy \with { | inr y<x => ((y :-: x :-: xs', consSorted (byRight y<x) xs-sorted), insertedHere idp idp) | inl x<=y => \let ((result, result-sorted), result-spec) => insert (xs', tail-sorted x xs' xs-sorted) y \in ((x :-: result, {?}), insertedThere idp result-spec)
рдкреНрд░рдорд╛рдг рдХреЗ рдмрд┐рдирд╛ рдЫреЛрдбрд╝реЗ рдЧрдП рдПрдХрд▓ рдЦрдВрдб рдХреЗ рд▓рд┐рдП, Arend рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрджрд░реНрдн рдореВрд▓реНрдп рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛:
Expected type: Sorted (x :-: (insert (\this, tail-sorted x \this \this) \this).1.1) Context: result-sorted : Sorted (insert (\this, tail-sorted \this \this \this) \this).1.1 xs-sorted : Sorted (x :-: xs') x : O x<=y : Or (x = y) (O.< xy) O : Dec result : List O y : O xs' : List O result-spec : InsertSpec xs' y (insert (xs', tail-sorted \this xs' \this) y).1.1
рд╕рдмреВрдд рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ
\case
рдСрдкрд░реЗрдЯрд░
рдХреА рдкреВрд░реА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛: рд╣рдо 5 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪрд░ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рди рд╡рд╛рд▓реЗ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЪреВрдВрдХрд┐ рдХреБрдЫ рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдЕрдиреНрдп рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдирд┐рд░реНрднрд░ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдмреГрд╣рджрд╛рдиреНрддреНрд░ рдирд┐рд░реНрдорд╛рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рдЪрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЕрдиреНрдп рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ (рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ
xs-sorted, result-spec
рдФрд░
result-sorted
рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рдХреЗ
\case
xs'
рдмрдЬрд╛рдп
xs'
result
рдЗрд╕реА рдирдореВрдиреЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдЧрд╛)ред
\return
рдирд┐рд░реНрдорд╛рдг, рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рд▓рдХреНрд╖реНрдп рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ
\case
рдХреНрд▓реЙрдЬ рдореЗрдВ, рдкрд░рд┐рдгрд╛рдореА рдЪрд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдирдореВрдиреЗ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд┐рдирд╛, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╕рднреА
\case
рдХреНрд▓реЙрдЬрд╝ рдХрд╛ рд▓рдХреНрд╖реНрдп рд╕реНрд╡рдпрдВ
\case
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рдПрдЧрд╛ред
\func insert {O : LinearOrder.Dec} (xs : SortedList O) (y : O) : \Sigma (ys : SortedList O) (InsertSpec xs.1 y ys.1) \elim xs | (nil, _) => ((y :-: nil, singletonSorted), insertedHere idp idp) | (:-: x xs', xs-sorted) => \case set-trichotomy-property xy \with { | inr y<x => ((y :-: x :-: xs', consSorted (byRight y<x) xs-sorted), insertedHere idp idp) | inl x<=y => \let ((result, result-sorted), result-spec) => insert (xs', tail-sorted x xs' xs-sorted) y \in ((x :-: result, \case result \as result, xs' \as xs', xs-sorted : Sorted (x :-: xs'), result-spec : InsertSpec xs' y result, result-sorted : Sorted result \return Sorted (x :-: result) \with { | nil, _, _, _, _ => singletonSorted | :-: r rs, _, _, insertedHere y=r _, result-sorted => consSorted (transport (\lam z => (x = z) || (x < z)) y=r (Or-to-|| x<=y)) result-sorted | :-: r rs, :-: x' _, consSorted x<=x' _, insertedThere x2=r _, result-sorted => consSorted (transport (\lam z => (x = z) || (x < z)) x2=r x<=x') result-sorted }), insertedThere idp result-spec)
рдХреЛрдб рдХреЗ рдЙрдкрд░реЛрдХреНрдд рдмреНрд▓реЙрдХ рдореЗрдВ, рдкреИрдЯрд░реНрди рддреБрд▓рдирд╛ рдХреЗ рдЕрдВрддрд┐рдо рджреЛ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ
consSorted
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдЬрдЯрд┐рд▓ рдкрд╣рд▓реЗ рддрд░реНрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд╛рдпрдХ рд╣реИрдВред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрди рджреЛрдиреЛрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐
{?}
рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЛрдиреЛрдВ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд░рд┐рдб рдЯрд╛рдЗрдорд░ рд╕реЗ рдкреВрдЫрддреЗ рд╣реИрдВред
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣рд╛рдВ рдФрд░ рд╡рд░реНрддрдорд╛рди рд▓рдХреНрд╖реНрдп рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░
(x = r) || O.< xr
(x = r) || O.< xr
ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╣рд▓реЗ рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдкрд░рд┐рд╕рд░ рд╣реИрдВ
x<=y : Or (x = y) (O.< xy) y=r : y = r
рдФрд░ рджреВрд╕рд░реЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ - рдкрд░рд┐рд╕рд░
x<=x' : (x = x') || O.< xx' x2=r : x' = r.
рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ: рдкрд╣рд▓рд╛ рд▓рдХреНрд╖реНрдп рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡реЗрд░рд┐рдПрдмрд▓
r
рдХреЛ рд╕рд╣реА рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ
Or (x = y) (O.< xy)
y рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рдмрдЬрд╛рдп
Or (x = y) (O.< xy)
, рдФрд░ рдлрд┐рд░ рдкреНрд░реЛрдкреЛрдЬрд╝рд▓реА рдЯреНрд░рдВрдХреЗрдЯреЗрдб рдЯрд╛рдЗрдк рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ
||
рдзрд╛рд░рд╛ 1.3 рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд
Or-to-||
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ ред рджреВрд╕рд░рд╛ рд▓рдХреНрд╖реНрдп рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕
(x = x') || O.< x x'
рдореЗрдВ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░реЗрдВ
(x = x') || O.< x x'
(x = x') || O.< x x'
рд╡реЗрд░рд┐рдПрдмрд▓
x'
рдмрдЬрд╛рдп рд╡реЗрд░рд┐рдПрдмрд▓
r
x'
ред
рд╡рд░реНрдгрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдСрдкрд░реЗрд╢рди рдХреЛ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдорд╛рдирдХ рдЕрд░реЗрдВрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖
transport
рдлрд╝рдВрдХреНрд╢рди рдореМрдЬреВрдж рд╣реИред рдЙрд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
\func transport {A : \Type} (B : A -> \Type) {aa' : A} (p : a = a') (b : B a) : B a'
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ,
OE
рдХреЛ рдЪрд░
A
рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЕрдиреНрдп
transport
рддрд░реНрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ), рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐
\lam (z : O) => (x = z) || (x < z)
\lam (z : O) => (x = z) || (x < z)
ред
рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕рдореНрдорд┐рд▓рди рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдм рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИ: рд╕реВрдЪреА
x :-: xs'
рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
x :-: xs'
, рд╣рдо рдкрд╣рд▓реЗ рд╕реВрдЪреА
x :-: xs'
рдХреА рд╕реВрдЪреА рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рд╕реВрдЪреА рдХреЗ рдЕрдВрджрд░ рдПрд▓рд┐рдореЗрдВрдЯ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реБрдП рддрддреНрд╡
x
рдХреЛ рдХреНрд░рдо рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рд╕реЗ рд▓рд╛рдЧреВ
insert
рдлрд╝рдВрдХреНрд╢рди рддрдХ рдкрд╣реБрдВрдЪ рдореЗрдВ рдорджрдж рдХрд░реЗрдВред
\func insertSort {O : LinearOrder.Dec} (xs : List O) : \Sigma (result : SortedList O) (Perm xs result.1) \elim xs | nil => ((nil, nilSorted), permTrivial idp) | :-: x xs' => \let | (ys, perm-xs'-ys) => insertSort xs' | (zs, zs-spec) => insert ys x \in (zs, permInsert perm-xs'-ys (insertedHere idp idp) zs-spec)
рд╣рдордиреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓рдХреНрд╖реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдФрд░ Arend рдкрд░ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдЗрд╕ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рдкреВрд░рд╛ Arend рдХреЛрдб
рдпрд╣рд╛рдБ рд╕реЗ рдПрдХ рдлрд╛рдЗрд▓ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рдХреЛрдИ рдпрд╣ рдкреВрдЫ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдЦреНрдд
LinearOrder.Dec
рдмрдЬрд╛рдп рдЕрдЧрд░ рдХреЛрдИ
insert
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХреИрд╕реЗ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛? рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рд╕рдордЧреНрд░рддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ, рдХрд╛рдЯреЗ рдЧрдП рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ
||
рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдерд╛, рдЕрд░реНрдерд╛рддреН, рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рдПрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп
||
рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
TotalOrder
рд▓рд┐рдП
TotalOrder
рдПрдирд╛рд▓реЙрдЧ рдмрдирд╛рдирд╛ рдЕрднреА рднреА рд╕рдВрднрд╡ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐
insert
рдлрдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реИ (рдпрд╣ рд╣рдореЗрдВ
totality xy
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реИрдВрдкрд▓ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛
insert
рд▓рд┐рдП
insert
рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛)ред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдореЗрдВ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдСрд░реНрдбрд░ рдХреА рдЧрдИ рд╕реВрдЪреА рд╣реИ, рдЬреЛ рдПрд▓рд┐рдореЗрдВрдЯ рд▓рд┐рд╕реНрдЯ рдореЗрдВ рджрд┐рдП рдЧрдП
xs
рдореЗрдВ рддрддреНрд╡
y
рдбрд╛рд▓рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдЪреНрдЪрд╛ рддрдереНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рдорд╛рдг рдЕрдм рдЗрддрдирд╛ рддреБрдЪреНрдЫ рдирд╣реАрдВ рд╣реИред рд╣рдо рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдЗрдЪреНрдЫреБрдХ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред
3. рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░
рдЗрд╕ рдкрд░рд┐рдЪрдп рдореЗрдВ, рд╣рдо Arend рднрд╛рд╖рд╛ рдХреЗ рдореБрдЦреНрдп рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реБрдП, рдФрд░ рдпрд╣ рднреА рд╕реАрдЦрд╛ рдХрд┐ рдХрдХреНрд╖рд╛ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╣рдо рдЗрд╕рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреЗ рдкреНрд░рдорд╛рдг рдХреЗ рд╕рд╛рде рд╕рд░рд▓рддрдо рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдХрд┐ "рд░реЛрдЬрдорд░реНрд░рд╛ рдХреА" рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Arend рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЬреИрд╕реЗ рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рддреНрдпрд╛рдкрдиред
рд╣рдордиреЗ Arend рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рд╕реЗ рджреВрд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдХрд╣рд╛ рдХрд┐
рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЗрди рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ "рдЧреЛрдВрдж" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Arend рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
\data Int | pos Nat | neg Nat \with { zero => pos zero }
рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╣рддреА рд╣реИ рдХрд┐ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рджреЛ рдкреНрд░рддрд┐рдпреЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рдмрдиреЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ "рд╕рдХрд╛рд░рд╛рддреНрдордХ" рдФрд░ "рдирдХрд╛рд░рд╛рддреНрдордХ" рд╢реВрдиреНрдп рдХреА рдкрд╣рдЪрд╛рди рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдорд╛рдирдХ рдХреЛрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА "рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐" рдХреЛ "рдПрдХ рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд" рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрди рдкреНрд░рддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рди рдХрд░реЗрдВ (рдпрд╣ рддрдм рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬрдм рдирдХрд╛рд░рд╛рддреНрдордХ
neg 1
рд╕рдВрдХреЗрддрди рдХрд╛ рдЕрд░реНрде рд╕рдВрдЦреНрдпрд╛ -1, рдирд╣реАрдВ -2 рд╣реИ) ред
рд╣рдордиреЗ рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рдЙрдирдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рдзреЗрдп рдФрд░ рд╣реЛрдореЛрдЯреЛрдкреА рд╕реНрддрд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣рд╛ред рд╣рдордиреЗ рд╢рд╛рдпрдж рд╣реА рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдкреНрд░рдХрд╛рд░
I
рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ Arend рдХрд╛ рддрд╛рд░реНрдХрд┐рдХ рдЖрдзрд╛рд░ рд╣реИред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХрд┐рддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ Arend рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╛рдирддрд╛ рдХреЛ рдПрдХ рдЕрдВрддрд░рд╛рд▓ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред , , , (.. ).
:
,
HoTT JetBrains Research.