Arend - HoTT- рдЖрдзрд╛рд░рд┐рдд рдЖрд╢реНрд░рд┐рдд рднрд╛рд╖рд╛ (рднрд╛рдЧ 2)

рдЖрд░реНрдЯреЗрдВрдб рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ , рд╣рдордиреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЖрдЧрдордирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ, рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдпреЛрдВ, рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╕реЗрдЯреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреАред

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.

Source: https://habr.com/ru/post/hi470632/


All Articles