Lean 语言参考

20.18. 范围🔗

range 表示某种类型的一系列连续元素,从下限到上限。 边界可以是开放的,在这种情况下,边界值不是范围的一部分;也可以是封闭的,在这种情况下,边界值是范围的一部分。 任一边界都可以省略,在这种情况下,范围在相应方向上无限延伸。

范围具有专用语法,由起点 ... 和终点组成。 起始点可以是 *(表示无限向下延续的范围),也可以是术语(表示具有特定起始值的范围)。 默认情况下,范围是左闭的:它们包含它们的起点。 尾随 < 表示该范围是左开的并且不包含其起点。 结束点可以是 *(在这种情况下,范围无限向上),也可以是一个术语,表示具有特定结束值的范围。 默认情况下,范围是右开的:它们不包含结束点。 终点可能会带有<前缀,表示它是右开的;这是默认值,不会改变含义,但可能更容易阅读。 它还可能带有 = 前缀,以指示该范围是右闭的并包含其结束点。

Ranges of Natural Numbers

包含数字 36 的范围可以用多种方式编写:

[3, 4, 5, 6]#eval (3...7).toList
[3, 4, 5, 6]
[3, 4, 5, 6]#eval (3...=6).toList
[3, 4, 5, 6]
[3, 4, 5, 6]#eval (2<...=6).toList
[3, 4, 5, 6]
Finite and Infinite Ranges

该范围无法转换为列表,因为它是无限的:

#eval failed to synthesize instance of type class Std.Rxi.IsAlwaysFinite Nat Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.(3...*).toList

左闭右无界范围的有限性由 Std.Rxi.IsAlwaysFinite 实例的存在来指示,而 Nat 则不存在该实例。 Std.Rco 是这些范围的类型,名称 Std.Rxi.IsAlwaysFinite 表明它确定所有右无界范围的有限性。

failed to synthesize instance of type class
  Std.Rxi.IsAlwaysFinite Nat

Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.

尝试枚举负整数会导致类似的错误,这次是因为无法确定最小元素:

#eval failed to synthesize instance of type class Std.PRange.Least? Int Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.(*...(0 : Int)).toList
failed to synthesize instance of type class
  Std.PRange.Least? Int

Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.

有限类型中的无界范围表示范围扩展到该类型的最大元素。 由于 UInt8 有 256 个元素,因此该范围包含 253 个元素:

253#eval ((3 : UInt8)...*).toArray.size
253
syntaxRange Syntax

该范围为左闭、右开,表示Std.Rco

term ::= ...
    | `a...b` is the range of elements greater than or equal to `a` and less than `b`.
See also `Std.Rco`.
term...term

该范围为左闭、右开,表示Std.Rco

term ::= ...
    | `a...<b` is the range of elements greater than or equal to `a` and less than `b`.
See also `Std.Rco`.
term...<term

该范围为左闭、右闭,表示Std.Rcc

term ::= ...
    | `a...=b` is the range of elements greater than or equal to `a` and less than or equal to
`b`. See also `Std.Rcc`.
term...=term

该范围是左闭右无限,表示 Std.Rci

term ::= ...
    | `a...*` is the range of elements greater than or equal to `a`. See also `Std.Rci`. term...*

该范围有左开、右开,表示Std.Roo

term ::= ...
    | `a<...b` is the range of elements greater than `a` and less than `b`.
See also `Std.Roo`.
term<...term

该范围有左开、右开,表示Std.Roo

term ::= ...
    | `a<...<b` is the range of elements greater than `a` and less than `b`.
See also `Std.Roo`.
term<...<term

该范围为左开、右闭,表示Std.Roc

term ::= ...
    | `a<...=b` is the range of elements greater than `a` and less than or equal to `b`.
See also `Std.Roc`.
term<...=term

该范围为左开、右无限,表示 Std.Roi

term ::= ...
    | `a<...*` is the range of elements greater than `a`. See also `Std.Roi`. term<...*

该范围为左无穷、右开,表示 Std.Rio

term ::= ...
    | `*...b` is the range of elements less than `b`. See also `Std.Rio`. *...term

该范围为左无穷、右开,表示 Std.Ric

term ::= ...
    | `*...<b` is the range of elements less than `b`. See also `Std.Rio`. *...<term

该范围是左无穷、右闭的,表示 Std.Ric

term ::= ...
    | `*...=b` is the range of elements less than or equal to `b`. See also `Std.Ric`. *...=term

该范围两边都是无穷大,表示 Std.Rii

term ::= ...
    | `*...*` is the range that is unbounded in both directions. See also `Std.Rii`. *...*

20.18.1. 范围类型🔗

🔗structure
Std.Rco.{u} (α : Type u) : Type u
Std.Rco.{u} (α : Type u) : Type u

A range of elements of α with a closed lower bound and an open upper bound.

a...b or a...<b is the range of all values greater than or equal to a : α and less than b : α. This is notation for Rco.mk a b.

Constructor

Std.Rco.mk.{u}

Fields

lower : α

The lower bound of the range. lower is included in the range.

upper : α

The upper bound of the range. upper is not included in the range.

🔗def
Std.Rco.iter.{u_1} {α : Type u_1} (r : Std.Rco α) : Std.Iter α
Std.Rco.iter.{u_1} {α : Type u_1} (r : Std.Rco α) : Std.Iter α

Returns an iterator over the given range. This iterator will emit the elements of the range in increasing order.

🔗def
Std.Rco.toArray.{u} {α : Type u} [LT α] [DecidableLT α] [Std.PRange.UpwardEnumerable α] [Std.PRange.LawfulUpwardEnumerable α] [Std.Rxo.IsAlwaysFinite α] (r : Std.Rco α) : Array α
Std.Rco.toArray.{u} {α : Type u} [LT α] [DecidableLT α] [Std.PRange.UpwardEnumerable α] [Std.PRange.LawfulUpwardEnumerable α] [Std.Rxo.IsAlwaysFinite α] (r : Std.Rco α) : Array α

Returns the elements of the given left-closed right-open range as an array in ascending order.

🔗def
Std.Rco.toList.{u} {α : Type u} [LT α] [DecidableLT α] [Std.PRange.UpwardEnumerable α] [Std.PRange.LawfulUpwardEnumerable α] [Std.Rxo.IsAlwaysFinite α] (r : Std.Rco α) : List α
Std.Rco.toList.{u} {α : Type u} [LT α] [DecidableLT α] [Std.PRange.UpwardEnumerable α] [Std.PRange.LawfulUpwardEnumerable α] [Std.Rxo.IsAlwaysFinite α] (r : Std.Rco α) : List α

Returns the elements of the given left-closed right-open range as a list in ascending order.

🔗def
Std.Rco.size.{u} {α : Type u} [Std.Rxo.HasSize α] (r : Std.Rco α) : Nat
Std.Rco.size.{u} {α : Type u} [Std.Rxo.HasSize α] (r : Std.Rco α) : Nat

Returns the number of elements contained in the given left-closed right-open range.

🔗def

Checks whether the range contains any value.

This function returns a meaningful value given LawfulUpwardEnumerable and LawfulUpwardEnumerableLT instances.

🔗structure
Std.Rcc.{u} (α : Type u) : Type u
Std.Rcc.{u} (α : Type u) : Type u

A range of elements of α with closed lower and upper bounds.

a...=b is the range of all values greater than or equal to a : α and less than or equal to b : α. This is notation for Rcc.mk a b.

Constructor

Std.Rcc.mk.{u}

Fields

lower : α

The lower bound of the range. lower is included in the range.

upper : α

The upper bound of the range. upper is included in the range.

🔗def
Std.Rcc.iter.{u_1} {α : Type u_1} (r : Std.Rcc α) : Std.Iter α
Std.Rcc.iter.{u_1} {α : Type u_1} (r : Std.Rcc α) : Std.Iter α

Returns an iterator over the given range. This iterator will emit the elements of the range in increasing order.

🔗def

Returns the elements of the given closed range as an array in ascending order.

🔗def

Returns the elements of the given closed range as a list in ascending order.

🔗def
Std.Rcc.size.{u} {α : Type u} [Std.Rxc.HasSize α] (r : Std.Rcc α) : Nat
Std.Rcc.size.{u} {α : Type u} [Std.Rxc.HasSize α] (r : Std.Rcc α) : Nat

Returns the number of elements contained in the given closed range.

🔗def

Checks whether the range contains any value.

This function returns a meaningful value given LawfulUpwardEnumerable and LawfulUpwardEnumerableLE instances.

🔗structure
Std.Rci.{u} (α : Type u) : Type u
Std.Rci.{u} (α : Type u) : Type u

An upward-unbounded range of elements of α with a closed lower bound.

a...* is the range of all values greater than or equal to a : α. This is notation for Rci.mk a.

Constructor

Std.Rci.mk.{u}

Fields

lower : α

The lower bound of the range. lower is included in the range.

🔗def
Std.Rci.iter.{u_1} {α : Type u_1} (r : Std.Rci α) : Std.Iter α
Std.Rci.iter.{u_1} {α : Type u_1} (r : Std.Rci α) : Std.Iter α

Returns an iterator over the given range. This iterator will emit the elements of the range in increasing order.

🔗def

Returns the elements of the given left-closed right-unbounded range as an array in ascending order.

🔗def

Returns the elements of the given left-closed right-unbounded range as a list in ascending order.

🔗def
Std.Rci.size.{u} {α : Type u} [Std.Rxi.HasSize α] (r : Std.Rci α) : Nat
Std.Rci.size.{u} {α : Type u} [Std.Rxi.HasSize α] (r : Std.Rci α) : Nat

Returns the number of elements contained in the given left-closed right-unbounded range.

🔗def

Checks whether the range contains any value. This function exists for completeness and always returns false: The closed lower bound is contained in the range, so left-closed right-unbounded ranges are never empty.

🔗structure
Std.Roo.{u} (α : Type u) : Type u
Std.Roo.{u} (α : Type u) : Type u

A range of elements of α with an open lower and upper bounds.

a<...b or a<...<b is the range of all values greater than a : α and less than b : α. This is notation for Roo.mk a b.

Constructor

Std.Roo.mk.{u}

Fields

lower : α

The lower bound of the range. lower is not included in the range.

upper : α

The upper bound of the range. upper is not included in the range.

🔗def

Returns an iterator over the given range. This iterator will emit the elements of the range in increasing order.

🔗def
Std.Roo.toArray.{u} {α : Type u} [LT α] [DecidableLT α] [Std.PRange.UpwardEnumerable α] [Std.PRange.LawfulUpwardEnumerable α] [Std.Rxo.IsAlwaysFinite α] (r : Std.Roo α) : Array α
Std.Roo.toArray.{u} {α : Type u} [LT α] [DecidableLT α] [Std.PRange.UpwardEnumerable α] [Std.PRange.LawfulUpwardEnumerable α] [Std.Rxo.IsAlwaysFinite α] (r : Std.Roo α) : Array α

Returns the elements of the given open range as an array in ascending order.

🔗def
Std.Roo.toList.{u} {α : Type u} [LT α] [DecidableLT α] [Std.PRange.UpwardEnumerable α] [Std.PRange.LawfulUpwardEnumerable α] [Std.Rxo.IsAlwaysFinite α] (r : Std.Roo α) : List α
Std.Roo.toList.{u} {α : Type u} [LT α] [DecidableLT α] [Std.PRange.UpwardEnumerable α] [Std.PRange.LawfulUpwardEnumerable α] [Std.Rxo.IsAlwaysFinite α] (r : Std.Roo α) : List α

Returns the elements of the given open range as a list in ascending order.

🔗def
Std.Roo.size.{u} {α : Type u} [Std.Rxo.HasSize α] [Std.PRange.UpwardEnumerable α] (r : Std.Roo α) : Nat
Std.Roo.size.{u} {α : Type u} [Std.Rxo.HasSize α] [Std.PRange.UpwardEnumerable α] (r : Std.Roo α) : Nat

Returns the number of elements contained in the given open range.

🔗def

Checks whether the range contains any value.

This function returns a meaningful value given LawfulUpwardEnumerable and LawfulUpwardEnumerableLT instances.

🔗structure
Std.Roc.{u} (α : Type u) : Type u
Std.Roc.{u} (α : Type u) : Type u

A range of elements of α with an open lower bound and a closed upper bound.

a<...=b is the range of all values greater than a : α and less than or equal to b : α. This is notation for Roc.mk a b.

Constructor

Std.Roc.mk.{u}

Fields

lower : α

The lower bound of the range. lower is not included in the range.

upper : α

The upper bound of the range. upper is included in the range.

🔗def

Returns an iterator over the given range. This iterator will emit the elements of the range in increasing order.

🔗def

Returns the elements of the given left-open right-closed range as an array in ascending order.

🔗def

Returns the elements of the given left-open right-closed range as a list in ascending order.

🔗def

Returns the number of elements contained in the given left-open right-closed range.

🔗def

Checks whether the range contains any value.

This function returns a meaningful value given LawfulUpwardEnumerable and LawfulUpwardEnumerableLT instances.

🔗structure
Std.Roi.{u} (α : Type u) : Type u
Std.Roi.{u} (α : Type u) : Type u

An upward-unbounded range of elements of α with an open lower bound.

a<...* is the range of all values greater than a : α. This is notation for Roi.mk a.

Constructor

Std.Roi.mk.{u}

Fields

lower : α

The lower bound of the range. lower is not included in the range.

🔗def

Returns an iterator over the given range. This iterator will emit the elements of the range in increasing order.

🔗def

Returns the elements of the given left-open right-unbounded range as an array in ascending order.

🔗def

Returns the elements of the given left-open right-unbounded range as a list in ascending order.

🔗def

Returns the number of elements contained in the given left-open right-unbounded range.

🔗def

Checks whether the range contains any value.

This function returns a meaningful value given a LawfulUpwardEnumerable instance.

🔗structure
Std.Rio.{u} (α : Type u) : Type u
Std.Rio.{u} (α : Type u) : Type u

A downward-unbounded range of elements of α with an open upper bound.

*...b or *...<b is the range of all values less than b : α. This is notation for Rio.mk b.

Constructor

Std.Rio.mk.{u}

Fields

upper : α

The upper bound of the range. upper is not included in the range.

🔗def
Std.Rio.iter.{u_1} {α : Type u_1} [Std.PRange.Least? α] (r : Std.Rio α) : Std.Iter α
Std.Rio.iter.{u_1} {α : Type u_1} [Std.PRange.Least? α] (r : Std.Rio α) : Std.Iter α

Returns an iterator over the given range. This iterator will emit the elements of the range in increasing order.

🔗def
Std.Rio.toArray.{u} {α : Type u} [Std.PRange.Least? α] [LT α] [DecidableLT α] [Std.PRange.UpwardEnumerable α] [Std.PRange.LawfulUpwardEnumerable α] [Std.Rxo.IsAlwaysFinite α] (r : Std.Rio α) : Array α
Std.Rio.toArray.{u} {α : Type u} [Std.PRange.Least? α] [LT α] [DecidableLT α] [Std.PRange.UpwardEnumerable α] [Std.PRange.LawfulUpwardEnumerable α] [Std.Rxo.IsAlwaysFinite α] (r : Std.Rio α) : Array α

Returns the elements of the given closed range as an array in ascending order.

🔗def
Std.Rio.toList.{u} {α : Type u} [Std.PRange.Least? α] [LT α] [DecidableLT α] [Std.PRange.UpwardEnumerable α] [Std.PRange.LawfulUpwardEnumerable α] [Std.Rxo.IsAlwaysFinite α] (r : Std.Rio α) : List α
Std.Rio.toList.{u} {α : Type u} [Std.PRange.Least? α] [LT α] [DecidableLT α] [Std.PRange.UpwardEnumerable α] [Std.PRange.LawfulUpwardEnumerable α] [Std.Rxo.IsAlwaysFinite α] (r : Std.Rio α) : List α

Returns the elements of the given closed range as a list in ascending order.

🔗def
Std.Rio.size.{u} {α : Type u} [Std.Rxo.HasSize α] [Std.PRange.Least? α] (r : Std.Rio α) : Nat
Std.Rio.size.{u} {α : Type u} [Std.Rxo.HasSize α] [Std.PRange.Least? α] (r : Std.Rio α) : Nat

Returns the number of elements contained in the given closed range.

🔗def

Checks whether the range contains any value.

This function returns a meaningful value given LawfulUpwardEnumerable, LawfulUpwardEnumerableLT and LawfulUpwardEnumerableLeast? instances.

🔗structure
Std.Ric.{u} (α : Type u) : Type u
Std.Ric.{u} (α : Type u) : Type u

A downward-unbounded range of elements of α with a closed upper bound.

*...=b is the range of all values less than or equal to b : α. This is notation for Ric.mk b.

Constructor

Std.Ric.mk.{u}

Fields

upper : α

The upper bound of the range. upper is included in the range.

🔗def
Std.Ric.iter.{u_1} {α : Type u_1} [Std.PRange.Least? α] (r : Std.Ric α) : Std.Iter α
Std.Ric.iter.{u_1} {α : Type u_1} [Std.PRange.Least? α] (r : Std.Ric α) : Std.Iter α

Returns an iterator over the given range. This iterator will emit the elements of the range in increasing order.

🔗def

Returns the elements of the given closed range as an array in ascending order.

🔗def

Returns the elements of the given closed range as a list in ascending order.

🔗def
Std.Ric.size.{u} {α : Type u} [Std.Rxc.HasSize α] [Std.PRange.Least? α] (r : Std.Ric α) : Nat
Std.Ric.size.{u} {α : Type u} [Std.Rxc.HasSize α] [Std.PRange.Least? α] (r : Std.Ric α) : Nat

Returns the number of elements contained in the given closed range.

🔗def

Checks whether the range contains any value. This function exists for completeness and always returns false: The closed upper bound is contained in the range, so left-unbounded right-closed ranges are never empty.

🔗structure
Std.Rii.{u} (α : Type u) : Type
Std.Rii.{u} (α : Type u) : Type

A full range of all elements of α. Its only inhabitant is the range *...*, which is notation for Rii.mk.

Constructor

Std.Rii.mk.{u}
🔗def
Std.Rii.iter.{u_1} {α : Type u_1} [Std.PRange.Least? α] : Std.Rii α Std.Iter α
Std.Rii.iter.{u_1} {α : Type u_1} [Std.PRange.Least? α] : Std.Rii α Std.Iter α

Returns an iterator over the given range. This iterator will emit the elements of the range in increasing order.

🔗def
Std.Rii.toArray.{u_1} {α : Type u_1} [Std.PRange.UpwardEnumerable α] [Std.PRange.Least? α] (r : Std.Rii α) [Std.Iterator (Std.Rxi.Iterator α) Id α] [Std.Iterators.Finite (Std.Rxi.Iterator α) Id] : Array α
Std.Rii.toArray.{u_1} {α : Type u_1} [Std.PRange.UpwardEnumerable α] [Std.PRange.Least? α] (r : Std.Rii α) [Std.Iterator (Std.Rxi.Iterator α) Id α] [Std.Iterators.Finite (Std.Rxi.Iterator α) Id] : Array α

Returns the elements of the given full range as an array in ascending order.

🔗def
Std.Rii.toList.{u} {α : Type u} [Std.PRange.UpwardEnumerable α] [Std.PRange.Least? α] (r : Std.Rii α) [Std.Iterator (Std.Rxi.Iterator α) Id α] [Std.Iterators.Finite (Std.Rxi.Iterator α) Id] : List α
Std.Rii.toList.{u} {α : Type u} [Std.PRange.UpwardEnumerable α] [Std.PRange.Least? α] (r : Std.Rii α) [Std.Iterator (Std.Rxi.Iterator α) Id α] [Std.Iterators.Finite (Std.Rxi.Iterator α) Id] : List α

Returns the elements of the given full range as a list in ascending order.

🔗def
Std.Rii.size.{u} {α : Type u} : Std.Rii α [Std.PRange.Least? α] [Std.Rxi.HasSize α] Nat
Std.Rii.size.{u} {α : Type u} : Std.Rii α [Std.PRange.Least? α] [Std.Rxi.HasSize α] Nat

Returns the number of elements contained in the full range.

🔗def

Checks whether the range contains any value.

This function returns a meaningful value given LawfulUpwardEnumerable and LawfulUpwardEnumerableLeast? instances.

20.18.2. 范围相关的 Type 类🔗

🔗type class
Std.PRange.UpwardEnumerable.{u} (α : Type u) : Type u
Std.PRange.UpwardEnumerable.{u} (α : Type u) : Type u

This typeclass provides the function succ? : α Option α that computes the successor of elements of α, or none if no successor exists. It also provides the function succMany?, which computes n-th successors.

succ? is expected to be acyclic: No element is its own transitive successor. If α is ordered, then every element larger than a : α should be a transitive successor of a. These properties and the compatibility of succ? with succMany? are encoded in the typeclasses LawfulUpwardEnumerable, LawfulUpwardEnumerableLE and LawfulUpwardEnumerableLT.

Instance Constructor

Std.PRange.UpwardEnumerable.mk.{u}

Methods

succ? : α  Option α

Maps elements of α to their successor, or none if no successor exists.

succMany? : Nat  α  Option α

Maps elements of α to their n-th successor, or none if no successor exists. This should semantically behave like repeatedly applying succ?, but it might be more efficient.

LawfulUpwardEnumerable ensures the compatibility with succ?.

If no other implementation is provided in UpwardEnumerable instance, succMany? repeatedly applies succ?.

🔗def

According to UpwardEnumerable.LE, a is less than or equal to b if b is a or a transitive successor of a.

🔗def

According to UpwardEnumerable.LT, a is less than b if b is a proper transitive successor of a. 'Proper' means that b is the n-th successor of a, where n > 0.

Given LawfulUpwardEnumerable α, no element of α is less than itself.

🔗type class

This typeclass ensures that an UpwardEnumerable α instance is well-behaved.

Instance Constructor

Std.PRange.LawfulUpwardEnumerable.mk.{u}

Methods

ne_of_lt :  (a b : α), Std.PRange.UpwardEnumerable.LT a b  a  b

There is no cyclic chain of successors.

succMany?_zero :  (a : α), Std.PRange.succMany? 0 a = some a

The 0-th successor of a is a itself.

succMany?_add_one :  (n : Nat) (a : α), Std.PRange.succMany? (n + 1) a = (Std.PRange.succMany? n a).bind Std.PRange.succ?

The n + 1-th successor of a is the successor of the n-th successor, given that said successors actually exist.

🔗type class
Std.PRange.Least?.{u} (α : Type u) : Type u
Std.PRange.Least?.{u} (α : Type u) : Type u

The typeclass Least? α optionally provides a smallest element of α, least? : Option α.

The main use case of this typeclass is to use it in combination with UpwardEnumerable to obtain a (possibly infinite) ascending enumeration of all elements of α.

Instance Constructor

Std.PRange.Least?.mk.{u}

Methods

least? : Option α

Returns the smallest element of α, or none if α is empty.

Only empty types are allowed to define least? := none. If α is ordered and nonempty, then the value of least? should be the smallest element according to the order on α.

🔗type class

This propositional typeclass ensures that UpwardEnumerable.succ? will never return none. In other words, it ensures that there will always be a successor.

Instance Constructor

Std.PRange.InfinitelyUpwardEnumerable.mk.{u}

Methods

isSome_succ? :  (a : α), (Std.PRange.succ? a).isSome = true

Every element of α has a successor.

🔗type class

This propositional typeclass ensures that UpwardEnumerable.succ? is injective.

Instance Constructor

Std.PRange.LinearlyUpwardEnumerable.mk.{u}

Methods

eq_of_succ?_eq :  (a b : α), Std.PRange.succ? a = Std.PRange.succ? b  a = b

The implementation of UpwardEnumerable.succ? for α is injective.

🔗type class

This type class ensures that right-unbounded ranges (i.e., for a bound a, a...*, a<...* and *...*) are always finite. This is a prerequisite for many functions and instances, such as Rci.toList or ForIn'.

Instance Constructor

Std.Rxi.IsAlwaysFinite.mk.{u}

Methods

finite :  (init : α),  n, Std.PRange.succMany? n init = none

For every elements init, there exists a chain of successors that results in an element that has no successors.

🔗type class
Std.Rxi.HasSize.{u} (α : Type u) : Type u
Std.Rxi.HasSize.{u} (α : Type u) : Type u

This typeclass provides support for the size function for ranges with closed lower bound (Ric.size, Rio.size and Rii.size).

The returned size should be equal to the number of elements returned by toList. This condition is captured by the typeclass LawfulHasSize.

Instance Constructor

Std.Rxi.HasSize.mk.{u}

Methods

size : α  Nat

Returns the number of elements starting from lo that satisfy the given upper bound.

🔗type class

This type class ensures that right-closed ranges (i.e., for bounds a and b, a...=b, a<...=b and *...=b) are always finite. This is a prerequisite for many functions and instances, such as Rcc.toList or ForIn'.

Instance Constructor

Std.Rxc.IsAlwaysFinite.mk.{u}

Methods

finite :  (init hi : α),  n, (Std.PRange.succMany? n init).elim True fun x => ¬x  hi

For every pair of elements init and hi, there exists a chain of successors that results in an element that either has no successors or is greater than hi.

🔗type class
Std.Rxc.HasSize.{u} (α : Type u) : Type u
Std.Rxc.HasSize.{u} (α : Type u) : Type u

This typeclass provides support for the size function for ranges with closed lower bound (Rcc.size, Rco.size and Rci.size).

The returned size should be equal to the number of elements returned by toList. This condition is captured by the typeclass LawfulHasSize.

Instance Constructor

Std.Rxc.HasSize.mk.{u}

Methods

size : α  α  Nat

Returns the number of elements starting from lo that satisfy the given upper bound.

20.18.3. 实施范围🔗

内置范围类型可以与任何类型一起使用,但它们的有用性取决于某些类型类实例的存在。 一般来说,范围要么检查成员资格,要么枚举或迭代。 要检查某个值是否包含在某个范围内,请使用 DecidableLTDecidableLE 实例将该值与该范围各自的开端点和闭端点进行比较。 要获取范围的迭代器,只需要 Std.PRange.UpwardEnumerableStd.PRange.LawfulUpwardEnumerable 的实例。 要在 Lean.Parser.Term.doFor : doElem`for x in e do s` iterates over `e` assuming `e`'s type has an instance of the `ForIn` typeclass. `break` and `continue` are supported inside `for` loops. `for x in e, x2 in e2, ... do s` iterates of the given collections in parallel, until at least one of them is exhausted. The types of `e2` etc. must implement the `Std.ToStream` typeclass. for 循环中直接迭代它,还需要 Std.PRange.LawfulUpwardEnumerableLEStd.PRange.LawfulUpwardEnumerableLT。 要枚举一个范围(例如通过调用 toList),必须证明它是有限的。 这是通过提供 Std.Rxi.IsAlwaysFiniteStd.Rxc.IsAlwaysFiniteStd.Rxo.IsAlwaysFinite 的实例来完成的。

Implementing Ranges

枚举类型 Day 表示星期几:

inductive Day where | mo | tu | we | th | fr | sa | su deriving Repr

虽然已经可以在范围内使用这种类型,但它们并不是特别有用。 没有会员实例:

#eval failed to synthesize instance of type class Membership Day (Std.Rcc Day) Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.Day.we (Day.mo...=Day.fr)
failed to synthesize instance of type class
  Membership Day (Std.Rcc Day)

Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.

范围不能迭代:

#eval show IO Unit from failed to synthesize instance for 'for_in%' notation ForIn (EIO IO.Error) (Std.Rcc Day) ?m.11for d in Day.mo...=Day.fr do IO.println s!"It's {repr d}"
failed to synthesize instance for 'for_in%' notation
  ForIn (EIO IO.Error) (Std.Rcc Day) ?m.11

即使类型是有限的,它们也不能被枚举:

#eval failed to synthesize instance of type class Std.PRange.UpwardEnumerable Day Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.(Day.sa...*).toList
failed to synthesize instance of type class
  Std.PRange.UpwardEnumerable Day

Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.

成员资格测试需要 DecidableLTDecidableLE 实例。 获得这些的一个简单方法是每天进行编号,并比较这些数字:

def Day.toNat : Day Nat | mo => 0 | tu => 1 | we => 2 | th => 3 | fr => 4 | sa => 5 | su => 6 instance : LT Day where lt d1 d2 := d1.toNat < d2.toNat instance : LE Day where le d1 d2 := d1.toNat d2.toNat instance : DecidableLT Day := fun d1 d2 => inferInstanceAs (Decidable (d1.toNat < d2.toNat)) instance : DecidableLE Day := fun d1 d2 => inferInstanceAs (Decidable (d1.toNat d2.toNat))

有了这些可用实例,成员资格测试就可以按预期进行:

def Day.isWeekday (d : Day) : Bool := d Day.mo...Day.sa true#eval Day.th.isWeekday
true
false#eval Day.sa.isWeekday
false

迭代和枚举都是重复应用后继函数的变体,直到达到范围的上限或类型的最大元素。 该后继函数是 Std.PRange.UpwardEnumerable.succ?。 在 Day 的命名空间中定义函数以与通用字段表示法一起使用也很方便:

def Day.succ? : Day Option Day | mo => some tu | tu => some we | we => some th | th => some fr | fr => some sa | sa => some su | su => none instance : Std.PRange.UpwardEnumerable Day where succ? := Day.succ?

迭代还需要证明 succ? 的实现是合理的。 其属性以 Std.PRange.UpwardEnumerable.succMany? 表示,它迭代 succ? 的应用一定次数,并具有以 Nat.repeatsucc? 形式的默认实现。 特别是,LawfulUpwardEnumerable 的实例需要证明 Std.PRange.UpwardEnumerable.succMany? 对应于默认实现,以及重复应用后继永远不会再次产生相同元素的证明。

第一步是为关于 succMany? 的两个证明编写两个辅助引理。 虽然它们可以内联写入实例声明中,但它们具有 @[simp] 属性很方便。

@[simp] theorem Day.succMany?_zero (d : Day) : Std.PRange.succMany? 0 d = some d := d:DayStd.PRange.succMany? 0 d = some d All goals completed! 🐙 @[simp] theorem Day.succMany?_add_one (n : Nat) (d : Day) : Std.PRange.succMany? (n + 1) d = (Std.PRange.succMany? n d).bind Std.PRange.succ? := n:Natd:DayStd.PRange.succMany? (n + 1) d = (Std.PRange.succMany? n d).bind Std.PRange.succ? All goals completed! 🐙

证明后继中没有循环使用一个方便的辅助引理来计算任意两天之间的后继步骤数。 它被标记为 @[grind →] ,因为当存在与其前提相匹配的假设时,它会添加大量新信息:

@[grind ] theorem Day.succMany?_steps {d d' : Day} {steps} : Std.PRange.succMany? steps d = some d' if d d' then steps = d'.toNat - d.toNat else False := d:Dayd':Daysteps:NatStd.PRange.succMany? steps d = some d' if d d' then steps = d'.toNat - d.toNat else False d:Dayd':Daysteps:Nath:Std.PRange.succMany? steps d = some d'if d d' then steps = d'.toNat - d.toNat else False match steps with d:Dayd':Daysteps:Nath:Std.PRange.succMany? 6 d = some d'if d d' then 6 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Nath:Std.PRange.succMany? 5 d = some d'if d d' then 5 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Nath:Std.PRange.succMany? 4 d = some d'if d d' then 4 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Nath:Std.PRange.succMany? 3 d = some d'if d d' then 3 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Nath:Std.PRange.succMany? 2 d = some d'if d d' then 2 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Nath:Std.PRange.succMany? 1 d = some d'if d d' then 1 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Nath:Std.PRange.succMany? 0 d = some d'if d d' then 0 = d'.toNat - d.toNat else False d':Daysteps:Nath:Std.PRange.succMany? 6 mo = some d'if mo d' then 6 = d'.toNat - mo.toNat else Falsed':Daysteps:Nath:Std.PRange.succMany? 6 tu = some d'if tu d' then 6 = d'.toNat - tu.toNat else Falsed':Daysteps:Nath:Std.PRange.succMany? 6 we = some d'if we d' then 6 = d'.toNat - we.toNat else Falsed':Daysteps:Nath:Std.PRange.succMany? 6 th = some d'if th d' then 6 = d'.toNat - th.toNat else Falsed':Daysteps:Nath:Std.PRange.succMany? 6 fr = some d'if fr d' then 6 = d'.toNat - fr.toNat else Falsed':Daysteps:Nath:Std.PRange.succMany? 6 sa = some d'if sa d' then 6 = d'.toNat - sa.toNat else Falsed':Daysteps:Nath:Std.PRange.succMany? 6 su = some d'if su d' then 6 = d'.toNat - su.toNat else False d':Daysteps:Nath:Std.PRange.succMany? 6 mo = some d'if mo d' then 6 = d'.toNat - mo.toNat else Falsed':Daysteps:Nath:Std.PRange.succMany? 6 tu = some d'if tu d' then 6 = d'.toNat - tu.toNat else Falsed':Daysteps:Nath:Std.PRange.succMany? 6 we = some d'if we d' then 6 = d'.toNat - we.toNat else Falsed':Daysteps:Nath:Std.PRange.succMany? 6 th = some d'if th d' then 6 = d'.toNat - th.toNat else Falsed':Daysteps:Nath:Std.PRange.succMany? 6 fr = some d'if fr d' then 6 = d'.toNat - fr.toNat else Falsed':Daysteps:Nath:Std.PRange.succMany? 6 sa = some d'if sa d' then 6 = d'.toNat - sa.toNat else Falsed':Daysteps:Nath:Std.PRange.succMany? 6 su = some d'if su d' then 6 = d'.toNat - su.toNat else False steps:Nath:Std.PRange.succMany? 6 su = some moif su mo then 6 = mo.toNat - su.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 su = some tuif su tu then 6 = tu.toNat - su.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 su = some weif su we then 6 = we.toNat - su.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 su = some thif su th then 6 = th.toNat - su.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 su = some frif su fr then 6 = fr.toNat - su.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 su = some saif su sa then 6 = sa.toNat - su.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 su = some suif su su then 6 = su.toNat - su.toNat else False steps:Nath:Std.PRange.succMany? 6 mo = some moif mo mo then 6 = mo.toNat - mo.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 mo = some tuif mo tu then 6 = tu.toNat - mo.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 mo = some weif mo we then 6 = we.toNat - mo.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 mo = some thif mo th then 6 = th.toNat - mo.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 mo = some frif mo fr then 6 = fr.toNat - mo.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 mo = some saif mo sa then 6 = sa.toNat - mo.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 mo = some suif mo su then 6 = su.toNat - mo.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 tu = some moif tu mo then 6 = mo.toNat - tu.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 tu = some tuif tu tu then 6 = tu.toNat - tu.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 tu = some weif tu we then 6 = we.toNat - tu.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 tu = some thif tu th then 6 = th.toNat - tu.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 tu = some frif tu fr then 6 = fr.toNat - tu.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 tu = some saif tu sa then 6 = sa.toNat - tu.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 tu = some suif tu su then 6 = su.toNat - tu.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 we = some moif we mo then 6 = mo.toNat - we.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 we = some tuif we tu then 6 = tu.toNat - we.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 we = some weif we we then 6 = we.toNat - we.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 we = some thif we th then 6 = th.toNat - we.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 we = some frif we fr then 6 = fr.toNat - we.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 we = some saif we sa then 6 = sa.toNat - we.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 we = some suif we su then 6 = su.toNat - we.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 th = some moif th mo then 6 = mo.toNat - th.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 th = some tuif th tu then 6 = tu.toNat - th.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 th = some weif th we then 6 = we.toNat - th.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 th = some thif th th then 6 = th.toNat - th.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 th = some frif th fr then 6 = fr.toNat - th.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 th = some saif th sa then 6 = sa.toNat - th.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 th = some suif th su then 6 = su.toNat - th.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 fr = some moif fr mo then 6 = mo.toNat - fr.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 fr = some tuif fr tu then 6 = tu.toNat - fr.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 fr = some weif fr we then 6 = we.toNat - fr.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 fr = some thif fr th then 6 = th.toNat - fr.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 fr = some frif fr fr then 6 = fr.toNat - fr.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 fr = some saif fr sa then 6 = sa.toNat - fr.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 fr = some suif fr su then 6 = su.toNat - fr.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 sa = some moif sa mo then 6 = mo.toNat - sa.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 sa = some tuif sa tu then 6 = tu.toNat - sa.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 sa = some weif sa we then 6 = we.toNat - sa.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 sa = some thif sa th then 6 = th.toNat - sa.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 sa = some frif sa fr then 6 = fr.toNat - sa.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 sa = some saif sa sa then 6 = sa.toNat - sa.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 sa = some suif sa su then 6 = su.toNat - sa.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 su = some moif su mo then 6 = mo.toNat - su.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 su = some tuif su tu then 6 = tu.toNat - su.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 su = some weif su we then 6 = we.toNat - su.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 su = some thif su th then 6 = th.toNat - su.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 su = some frif su fr then 6 = fr.toNat - su.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 su = some saif su sa then 6 = sa.toNat - su.toNat else Falsesteps:Nath:Std.PRange.succMany? 6 su = some suif su su then 6 = su.toNat - su.toNat else False All goals completed! 🐙 d:Dayd':Daysteps:Natn:Nath:Std.PRange.succMany? (n + 7) d = some d'if d d' then n + 7 = d'.toNat - d.toNat else False d:Dayd':Daysteps:Natn:Nath:(((((((Std.PRange.succMany? n d).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'if d d' then n + 7 = d'.toNat - d.toNat else False cases h' : (Std.PRange.succMany? n d) with d:Dayd':Daysteps:Natn:Nath:(((((((Std.PRange.succMany? n d).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'h':Std.PRange.succMany? n d = noneif d d' then n + 7 = d'.toNat - d.toNat else False All goals completed! 🐙 d:Dayd':Daysteps:Natn:Nath:(((((((Std.PRange.succMany? n d).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'd'':Dayh':Std.PRange.succMany? n d = some d''if d d' then n + 7 = d'.toNat - d.toNat else False d:Dayd':Daysteps:Natn:Natd'':Dayh:(((((((some d'').bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'h':Std.PRange.succMany? n d = some d''if d d' then n + 7 = d'.toNat - d.toNat else False d:Dayd':Daysteps:Natn:Nath:(((((((some mo).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'h':Std.PRange.succMany? n d = some moif d d' then n + 7 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Natn:Nath:(((((((some tu).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'h':Std.PRange.succMany? n d = some tuif d d' then n + 7 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Natn:Nath:(((((((some we).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'h':Std.PRange.succMany? n d = some weif d d' then n + 7 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Natn:Nath:(((((((some th).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'h':Std.PRange.succMany? n d = some thif d d' then n + 7 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Natn:Nath:(((((((some fr).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'h':Std.PRange.succMany? n d = some frif d d' then n + 7 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Natn:Nath:(((((((some sa).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'h':Std.PRange.succMany? n d = some saif d d' then n + 7 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Natn:Nath:(((((((some su).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'h':Std.PRange.succMany? n d = some suif d d' then n + 7 = d'.toNat - d.toNat else False d:Dayd':Daysteps:Natn:Nath:(((((((some mo).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'h':Std.PRange.succMany? n d = some moif d d' then n + 7 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Natn:Nath:(((((((some tu).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'h':Std.PRange.succMany? n d = some tuif d d' then n + 7 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Natn:Nath:(((((((some we).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'h':Std.PRange.succMany? n d = some weif d d' then n + 7 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Natn:Nath:(((((((some th).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'h':Std.PRange.succMany? n d = some thif d d' then n + 7 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Natn:Nath:(((((((some fr).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'h':Std.PRange.succMany? n d = some frif d d' then n + 7 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Natn:Nath:(((((((some sa).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'h':Std.PRange.succMany? n d = some saif d d' then n + 7 = d'.toNat - d.toNat else Falsed:Dayd':Daysteps:Natn:Nath:(((((((some su).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ?).bind Std.PRange.succ? = some d'h':Std.PRange.succMany? n d = some suif d d' then n + 7 = d'.toNat - d.toNat else False All goals completed! 🐙

有了这个助手,证明就相当简短了:

instance : Std.PRange.LawfulUpwardEnumerable Day where ne_of_lt d1 d2 h := d1:Dayd2:Dayh:Std.PRange.UpwardEnumerable.LT d1 d2d1 d2 All goals completed! 🐙 succMany?_zero := Day.succMany?_zero succMany?_add_one := Day.succMany?_add_one

证明三种可枚举范围是有限的使得枚举天数范围成为可能:

instance : Std.Rxo.IsAlwaysFinite Day where finite init hi := 7, init:Dayhi:Day(Std.PRange.succMany? 7 init).elim True fun x => ¬x < hi hi:Day(Std.PRange.succMany? 7 Day.mo).elim True fun x => ¬x < hihi:Day(Std.PRange.succMany? 7 Day.tu).elim True fun x => ¬x < hihi:Day(Std.PRange.succMany? 7 Day.we).elim True fun x => ¬x < hihi:Day(Std.PRange.succMany? 7 Day.th).elim True fun x => ¬x < hihi:Day(Std.PRange.succMany? 7 Day.fr).elim True fun x => ¬x < hihi:Day(Std.PRange.succMany? 7 Day.sa).elim True fun x => ¬x < hihi:Day(Std.PRange.succMany? 7 Day.su).elim True fun x => ¬x < hi hi:Day(Std.PRange.succMany? 7 Day.mo).elim True fun x => ¬x < hihi:Day(Std.PRange.succMany? 7 Day.tu).elim True fun x => ¬x < hihi:Day(Std.PRange.succMany? 7 Day.we).elim True fun x => ¬x < hihi:Day(Std.PRange.succMany? 7 Day.th).elim True fun x => ¬x < hihi:Day(Std.PRange.succMany? 7 Day.fr).elim True fun x => ¬x < hihi:Day(Std.PRange.succMany? 7 Day.sa).elim True fun x => ¬x < hihi:Day(Std.PRange.succMany? 7 Day.su).elim True fun x => ¬x < hi All goals completed! 🐙 instance : Std.Rxc.IsAlwaysFinite Day where finite init hi := 7, init:Dayhi:Day(Std.PRange.succMany? 7 init).elim True fun x => ¬x hi hi:Day(Std.PRange.succMany? 7 Day.mo).elim True fun x => ¬x hihi:Day(Std.PRange.succMany? 7 Day.tu).elim True fun x => ¬x hihi:Day(Std.PRange.succMany? 7 Day.we).elim True fun x => ¬x hihi:Day(Std.PRange.succMany? 7 Day.th).elim True fun x => ¬x hihi:Day(Std.PRange.succMany? 7 Day.fr).elim True fun x => ¬x hihi:Day(Std.PRange.succMany? 7 Day.sa).elim True fun x => ¬x hihi:Day(Std.PRange.succMany? 7 Day.su).elim True fun x => ¬x hi hi:Day(Std.PRange.succMany? 7 Day.mo).elim True fun x => ¬x hihi:Day(Std.PRange.succMany? 7 Day.tu).elim True fun x => ¬x hihi:Day(Std.PRange.succMany? 7 Day.we).elim True fun x => ¬x hihi:Day(Std.PRange.succMany? 7 Day.th).elim True fun x => ¬x hihi:Day(Std.PRange.succMany? 7 Day.fr).elim True fun x => ¬x hihi:Day(Std.PRange.succMany? 7 Day.sa).elim True fun x => ¬x hihi:Day(Std.PRange.succMany? 7 Day.su).elim True fun x => ¬x hi All goals completed! 🐙 instance : Std.Rxi.IsAlwaysFinite Day where finite init := 7, init:DayStd.PRange.succMany? 7 init = none Std.PRange.succMany? 7 Day.mo = noneStd.PRange.succMany? 7 Day.tu = noneStd.PRange.succMany? 7 Day.we = noneStd.PRange.succMany? 7 Day.th = noneStd.PRange.succMany? 7 Day.fr = noneStd.PRange.succMany? 7 Day.sa = noneStd.PRange.succMany? 7 Day.su = none Std.PRange.succMany? 7 Day.mo = noneStd.PRange.succMany? 7 Day.tu = noneStd.PRange.succMany? 7 Day.we = noneStd.PRange.succMany? 7 Day.th = noneStd.PRange.succMany? 7 Day.fr = noneStd.PRange.succMany? 7 Day.sa = noneStd.PRange.succMany? 7 Day.su = none All goals completed! 🐙 def allWeekdays : List Day := (Day.mo...Day.sa).toList [Day.mo, Day.tu, Day.we, Day.th, Day.fr]#eval allWeekdays
[Day.mo, Day.tu, Day.we, Day.th, Day.fr]

添加 Std.PRange.Least? 实例允许枚举左无界范围:

instance : Std.PRange.Least? Day where least? := some .mo def allWeekdays' : List Day := (*...Day.sa).toList [Day.mo, Day.tu, Day.we, Day.th, Day.fr]#eval allWeekdays'
[Day.mo, Day.tu, Day.we, Day.th, Day.fr]

还可以创建一个可枚举的迭代器,但它还不能与 Lean.Parser.Term.doFor : doElem`for x in e do s` iterates over `e` assuming `e`'s type has an instance of the `ForIn` typeclass. `break` and `continue` are supported inside `for` loops. `for x in e, x2 in e2, ... do s` iterates of the given collections in parallel, until at least one of them is exhausted. The types of `e2` etc. must implement the `Std.ToStream` typeclass. for 一起使用:

[Day.we, Day.th]#eval (Day.we...Day.fr).iter.toList
[Day.we, Day.th]
#eval show IO Unit from do failed to synthesize instance for 'for_in%' notation ForIn (EIO IO.Error) (Std.Iter Day) ?m.12for d in (Day.mo...Day.th).iter do IO.println s!"It's {repr d}."
failed to synthesize instance for 'for_in%' notation
  ForIn (EIO IO.Error) (Std.Iter Day) ?m.12

启用迭代从而使天数范围功能齐全的最后一步是证明 Day 上的小于和小于或等于关系对应于通过迭代后继函数导出的不等式概念。 这是在类 Std.PRange.LawfulUpwardEnumerableLTStd.PRange.LawfulUpwardEnumerableLE 中捕获的,这要求这两个概念在逻辑上是等效的:

instance : Std.PRange.LawfulUpwardEnumerableLT Day where lt_iff d1 d2 := d1:Dayd2:Dayd1 < d2 Std.PRange.UpwardEnumerable.LT d1 d2 d1:Dayd2:Dayd1 < d2 Std.PRange.UpwardEnumerable.LT d1 d2d1:Dayd2:DayStd.PRange.UpwardEnumerable.LT d1 d2 d1 < d2 d1:Dayd2:Dayd1 < d2 Std.PRange.UpwardEnumerable.LT d1 d2 d1:Dayd2:Daylt:d1 < d2Std.PRange.UpwardEnumerable.LT d1 d2 d1:Dayd2:Daylt:d1 < d2 n, (Std.PRange.succMany? n d1).bind Std.PRange.succ? = some d2 d1:Dayd2:Daylt:d1 < d2(Std.PRange.succMany? (d2.toNat - d1.toNat.succ) d1).bind Std.PRange.succ? = some d2 d2:Daylt:Day.mo < d2(Std.PRange.succMany? (d2.toNat - Day.mo.toNat.succ) Day.mo).bind Std.PRange.succ? = some d2d2:Daylt:Day.tu < d2(Std.PRange.succMany? (d2.toNat - Day.tu.toNat.succ) Day.tu).bind Std.PRange.succ? = some d2d2:Daylt:Day.we < d2(Std.PRange.succMany? (d2.toNat - Day.we.toNat.succ) Day.we).bind Std.PRange.succ? = some d2d2:Daylt:Day.th < d2(Std.PRange.succMany? (d2.toNat - Day.th.toNat.succ) Day.th).bind Std.PRange.succ? = some d2d2:Daylt:Day.fr < d2(Std.PRange.succMany? (d2.toNat - Day.fr.toNat.succ) Day.fr).bind Std.PRange.succ? = some d2d2:Daylt:Day.sa < d2(Std.PRange.succMany? (d2.toNat - Day.sa.toNat.succ) Day.sa).bind Std.PRange.succ? = some d2d2:Daylt:Day.su < d2(Std.PRange.succMany? (d2.toNat - Day.su.toNat.succ) Day.su).bind Std.PRange.succ? = some d2 d2:Daylt:Day.mo < d2(Std.PRange.succMany? (d2.toNat - Day.mo.toNat.succ) Day.mo).bind Std.PRange.succ? = some d2d2:Daylt:Day.tu < d2(Std.PRange.succMany? (d2.toNat - Day.tu.toNat.succ) Day.tu).bind Std.PRange.succ? = some d2d2:Daylt:Day.we < d2(Std.PRange.succMany? (d2.toNat - Day.we.toNat.succ) Day.we).bind Std.PRange.succ? = some d2d2:Daylt:Day.th < d2(Std.PRange.succMany? (d2.toNat - Day.th.toNat.succ) Day.th).bind Std.PRange.succ? = some d2d2:Daylt:Day.fr < d2(Std.PRange.succMany? (d2.toNat - Day.fr.toNat.succ) Day.fr).bind Std.PRange.succ? = some d2d2:Daylt:Day.sa < d2(Std.PRange.succMany? (d2.toNat - Day.sa.toNat.succ) Day.sa).bind Std.PRange.succ? = some d2d2:Daylt:Day.su < d2(Std.PRange.succMany? (d2.toNat - Day.su.toNat.succ) Day.su).bind Std.PRange.succ? = some d2 lt:Day.su < Day.mo(Std.PRange.succMany? (Day.mo.toNat - Day.su.toNat.succ) Day.su).bind Std.PRange.succ? = some Day.molt:Day.su < Day.tu(Std.PRange.succMany? (Day.tu.toNat - Day.su.toNat.succ) Day.su).bind Std.PRange.succ? = some Day.tult:Day.su < Day.we(Std.PRange.succMany? (Day.we.toNat - Day.su.toNat.succ) Day.su).bind Std.PRange.succ? = some Day.welt:Day.su < Day.th(Std.PRange.succMany? (Day.th.toNat - Day.su.toNat.succ) Day.su).bind Std.PRange.succ? = some Day.thlt:Day.su < Day.fr(Std.PRange.succMany? (Day.fr.toNat - Day.su.toNat.succ) Day.su).bind Std.PRange.succ? = some Day.frlt:Day.su < Day.sa(Std.PRange.succMany? (Day.sa.toNat - Day.su.toNat.succ) Day.su).bind Std.PRange.succ? = some Day.salt:Day.su < Day.su(Std.PRange.succMany? (Day.su.toNat - Day.su.toNat.succ) Day.su).bind Std.PRange.succ? = some Day.su lt:Day.mo < Day.mo(Std.PRange.succMany? (Day.mo.toNat - Day.mo.toNat.succ) Day.mo).bind Std.PRange.succ? = some Day.molt:Day.mo < Day.tu(Std.PRange.succMany? (Day.tu.toNat - Day.mo.toNat.succ) Day.mo).bind Std.PRange.succ? = some Day.tult:Day.mo < Day.we(Std.PRange.succMany? (Day.we.toNat - Day.mo.toNat.succ) Day.mo).bind Std.PRange.succ? = some Day.welt:Day.mo < Day.th(Std.PRange.succMany? (Day.th.toNat - Day.mo.toNat.succ) Day.mo).bind Std.PRange.succ? = some Day.thlt:Day.mo < Day.fr(Std.PRange.succMany? (Day.fr.toNat - Day.mo.toNat.succ) Day.mo).bind Std.PRange.succ? = some Day.frlt:Day.mo < Day.sa(Std.PRange.succMany? (Day.sa.toNat - Day.mo.toNat.succ) Day.mo).bind Std.PRange.succ? = some Day.salt:Day.mo < Day.su(Std.PRange.succMany? (Day.su.toNat - Day.mo.toNat.succ) Day.mo).bind Std.PRange.succ? = some Day.sult:Day.tu < Day.mo(Std.PRange.succMany? (Day.mo.toNat - Day.tu.toNat.succ) Day.tu).bind Std.PRange.succ? = some Day.molt:Day.tu < Day.tu(Std.PRange.succMany? (Day.tu.toNat - Day.tu.toNat.succ) Day.tu).bind Std.PRange.succ? = some Day.tult:Day.tu < Day.we(Std.PRange.succMany? (Day.we.toNat - Day.tu.toNat.succ) Day.tu).bind Std.PRange.succ? = some Day.welt:Day.tu < Day.th(Std.PRange.succMany? (Day.th.toNat - Day.tu.toNat.succ) Day.tu).bind Std.PRange.succ? = some Day.thlt:Day.tu < Day.fr(Std.PRange.succMany? (Day.fr.toNat - Day.tu.toNat.succ) Day.tu).bind Std.PRange.succ? = some Day.frlt:Day.tu < Day.sa(Std.PRange.succMany? (Day.sa.toNat - Day.tu.toNat.succ) Day.tu).bind Std.PRange.succ? = some Day.salt:Day.tu < Day.su(Std.PRange.succMany? (Day.su.toNat - Day.tu.toNat.succ) Day.tu).bind Std.PRange.succ? = some Day.sult:Day.we < Day.mo(Std.PRange.succMany? (Day.mo.toNat - Day.we.toNat.succ) Day.we).bind Std.PRange.succ? = some Day.molt:Day.we < Day.tu(Std.PRange.succMany? (Day.tu.toNat - Day.we.toNat.succ) Day.we).bind Std.PRange.succ? = some Day.tult:Day.we < Day.we(Std.PRange.succMany? (Day.we.toNat - Day.we.toNat.succ) Day.we).bind Std.PRange.succ? = some Day.welt:Day.we < Day.th(Std.PRange.succMany? (Day.th.toNat - Day.we.toNat.succ) Day.we).bind Std.PRange.succ? = some Day.thlt:Day.we < Day.fr(Std.PRange.succMany? (Day.fr.toNat - Day.we.toNat.succ) Day.we).bind Std.PRange.succ? = some Day.frlt:Day.we < Day.sa(Std.PRange.succMany? (Day.sa.toNat - Day.we.toNat.succ) Day.we).bind Std.PRange.succ? = some Day.salt:Day.we < Day.su(Std.PRange.succMany? (Day.su.toNat - Day.we.toNat.succ) Day.we).bind Std.PRange.succ? = some Day.sult:Day.th < Day.mo(Std.PRange.succMany? (Day.mo.toNat - Day.th.toNat.succ) Day.th).bind Std.PRange.succ? = some Day.molt:Day.th < Day.tu(Std.PRange.succMany? (Day.tu.toNat - Day.th.toNat.succ) Day.th).bind Std.PRange.succ? = some Day.tult:Day.th < Day.we(Std.PRange.succMany? (Day.we.toNat - Day.th.toNat.succ) Day.th).bind Std.PRange.succ? = some Day.welt:Day.th < Day.th(Std.PRange.succMany? (Day.th.toNat - Day.th.toNat.succ) Day.th).bind Std.PRange.succ? = some Day.thlt:Day.th < Day.fr(Std.PRange.succMany? (Day.fr.toNat - Day.th.toNat.succ) Day.th).bind Std.PRange.succ? = some Day.frlt:Day.th < Day.sa(Std.PRange.succMany? (Day.sa.toNat - Day.th.toNat.succ) Day.th).bind Std.PRange.succ? = some Day.salt:Day.th < Day.su(Std.PRange.succMany? (Day.su.toNat - Day.th.toNat.succ) Day.th).bind Std.PRange.succ? = some Day.sult:Day.fr < Day.mo(Std.PRange.succMany? (Day.mo.toNat - Day.fr.toNat.succ) Day.fr).bind Std.PRange.succ? = some Day.molt:Day.fr < Day.tu(Std.PRange.succMany? (Day.tu.toNat - Day.fr.toNat.succ) Day.fr).bind Std.PRange.succ? = some Day.tult:Day.fr < Day.we(Std.PRange.succMany? (Day.we.toNat - Day.fr.toNat.succ) Day.fr).bind Std.PRange.succ? = some Day.welt:Day.fr < Day.th(Std.PRange.succMany? (Day.th.toNat - Day.fr.toNat.succ) Day.fr).bind Std.PRange.succ? = some Day.thlt:Day.fr < Day.fr(Std.PRange.succMany? (Day.fr.toNat - Day.fr.toNat.succ) Day.fr).bind Std.PRange.succ? = some Day.frlt:Day.fr < Day.sa(Std.PRange.succMany? (Day.sa.toNat - Day.fr.toNat.succ) Day.fr).bind Std.PRange.succ? = some Day.salt:Day.fr < Day.su(Std.PRange.succMany? (Day.su.toNat - Day.fr.toNat.succ) Day.fr).bind Std.PRange.succ? = some Day.sult:Day.sa < Day.mo(Std.PRange.succMany? (Day.mo.toNat - Day.sa.toNat.succ) Day.sa).bind Std.PRange.succ? = some Day.molt:Day.sa < Day.tu(Std.PRange.succMany? (Day.tu.toNat - Day.sa.toNat.succ) Day.sa).bind Std.PRange.succ? = some Day.tult:Day.sa < Day.we(Std.PRange.succMany? (Day.we.toNat - Day.sa.toNat.succ) Day.sa).bind Std.PRange.succ? = some Day.welt:Day.sa < Day.th(Std.PRange.succMany? (Day.th.toNat - Day.sa.toNat.succ) Day.sa).bind Std.PRange.succ? = some Day.thlt:Day.sa < Day.fr(Std.PRange.succMany? (Day.fr.toNat - Day.sa.toNat.succ) Day.sa).bind Std.PRange.succ? = some Day.frlt:Day.sa < Day.sa(Std.PRange.succMany? (Day.sa.toNat - Day.sa.toNat.succ) Day.sa).bind Std.PRange.succ? = some Day.salt:Day.sa < Day.su(Std.PRange.succMany? (Day.su.toNat - Day.sa.toNat.succ) Day.sa).bind Std.PRange.succ? = some Day.sult:Day.su < Day.mo(Std.PRange.succMany? (Day.mo.toNat - Day.su.toNat.succ) Day.su).bind Std.PRange.succ? = some Day.molt:Day.su < Day.tu(Std.PRange.succMany? (Day.tu.toNat - Day.su.toNat.succ) Day.su).bind Std.PRange.succ? = some Day.tult:Day.su < Day.we(Std.PRange.succMany? (Day.we.toNat - Day.su.toNat.succ) Day.su).bind Std.PRange.succ? = some Day.welt:Day.su < Day.th(Std.PRange.succMany? (Day.th.toNat - Day.su.toNat.succ) Day.su).bind Std.PRange.succ? = some Day.thlt:Day.su < Day.fr(Std.PRange.succMany? (Day.fr.toNat - Day.su.toNat.succ) Day.su).bind Std.PRange.succ? = some Day.frlt:Day.su < Day.sa(Std.PRange.succMany? (Day.sa.toNat - Day.su.toNat.succ) Day.su).bind Std.PRange.succ? = some Day.salt:Day.su < Day.su(Std.PRange.succMany? (Day.su.toNat - Day.su.toNat.succ) Day.su).bind Std.PRange.succ? = some Day.su lt:Day.su < Day.suFalse lt:Day.mo < Day.moFalselt:Day.tu < Day.moFalselt:Day.tu < Day.tuFalselt:Day.we < Day.moFalselt:Day.we < Day.tuFalselt:Day.we < Day.weFalselt:Day.th < Day.moFalselt:Day.th < Day.tuFalselt:Day.th < Day.weFalselt:Day.th < Day.thFalselt:Day.fr < Day.moFalselt:Day.fr < Day.tuFalselt:Day.fr < Day.weFalselt:Day.fr < Day.thFalselt:Day.fr < Day.frFalselt:Day.sa < Day.moFalselt:Day.sa < Day.tuFalselt:Day.sa < Day.weFalselt:Day.sa < Day.thFalselt:Day.sa < Day.frFalselt:Day.sa < Day.saFalselt:Day.su < Day.moFalselt:Day.su < Day.tuFalselt:Day.su < Day.weFalselt:Day.su < Day.thFalselt:Day.su < Day.frFalselt:Day.su < Day.saFalselt:Day.su < Day.suFalse All goals completed! 🐙 d1:Dayd2:DayStd.PRange.UpwardEnumerable.LT d1 d2 d1 < d2 d1:Dayd2:Daysteps:Nateq:Std.PRange.succMany? (steps + 1) d1 = some d2d1 < d2 d1:Dayd2:Daysteps:Nateq:Std.PRange.succMany? (steps + 1) d1 = some d2this:if d1 d2 then steps + 1 = d2.toNat - d1.toNat else Falsed1 < d2 d2:Daysteps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some d2this:if Day.mo d2 then steps + 1 = d2.toNat - Day.mo.toNat else FalseDay.mo < d2d2:Daysteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some d2this:if Day.tu d2 then steps + 1 = d2.toNat - Day.tu.toNat else FalseDay.tu < d2d2:Daysteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some d2this:if Day.we d2 then steps + 1 = d2.toNat - Day.we.toNat else FalseDay.we < d2d2:Daysteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some d2this:if Day.th d2 then steps + 1 = d2.toNat - Day.th.toNat else FalseDay.th < d2d2:Daysteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some d2this:if Day.fr d2 then steps + 1 = d2.toNat - Day.fr.toNat else FalseDay.fr < d2d2:Daysteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some d2this:if Day.sa d2 then steps + 1 = d2.toNat - Day.sa.toNat else FalseDay.sa < d2d2:Daysteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some d2this:if Day.su d2 then steps + 1 = d2.toNat - Day.su.toNat else FalseDay.su < d2 d2:Daysteps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some d2this:if Day.mo d2 then steps + 1 = d2.toNat - Day.mo.toNat else FalseDay.mo < d2d2:Daysteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some d2this:if Day.tu d2 then steps + 1 = d2.toNat - Day.tu.toNat else FalseDay.tu < d2d2:Daysteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some d2this:if Day.we d2 then steps + 1 = d2.toNat - Day.we.toNat else FalseDay.we < d2d2:Daysteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some d2this:if Day.th d2 then steps + 1 = d2.toNat - Day.th.toNat else FalseDay.th < d2d2:Daysteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some d2this:if Day.fr d2 then steps + 1 = d2.toNat - Day.fr.toNat else FalseDay.fr < d2d2:Daysteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some d2this:if Day.sa d2 then steps + 1 = d2.toNat - Day.sa.toNat else FalseDay.sa < d2d2:Daysteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some d2this:if Day.su d2 then steps + 1 = d2.toNat - Day.su.toNat else FalseDay.su < d2 steps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.mothis:if Day.su Day.mo then steps + 1 = Day.mo.toNat - Day.su.toNat else FalseDay.su < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.tuthis:if Day.su Day.tu then steps + 1 = Day.tu.toNat - Day.su.toNat else FalseDay.su < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.wethis:if Day.su Day.we then steps + 1 = Day.we.toNat - Day.su.toNat else FalseDay.su < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.ththis:if Day.su Day.th then steps + 1 = Day.th.toNat - Day.su.toNat else FalseDay.su < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.frthis:if Day.su Day.fr then steps + 1 = Day.fr.toNat - Day.su.toNat else FalseDay.su < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.sathis:if Day.su Day.sa then steps + 1 = Day.sa.toNat - Day.su.toNat else FalseDay.su < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.suthis:if Day.su Day.su then steps + 1 = Day.su.toNat - Day.su.toNat else FalseDay.su < Day.su steps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.mothis:if Day.mo Day.mo then steps + 1 = Day.mo.toNat - Day.mo.toNat else FalseDay.mo < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.tuthis:if Day.mo Day.tu then steps + 1 = Day.tu.toNat - Day.mo.toNat else FalseDay.mo < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.wethis:if Day.mo Day.we then steps + 1 = Day.we.toNat - Day.mo.toNat else FalseDay.mo < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.ththis:if Day.mo Day.th then steps + 1 = Day.th.toNat - Day.mo.toNat else FalseDay.mo < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.frthis:if Day.mo Day.fr then steps + 1 = Day.fr.toNat - Day.mo.toNat else FalseDay.mo < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.sathis:if Day.mo Day.sa then steps + 1 = Day.sa.toNat - Day.mo.toNat else FalseDay.mo < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.suthis:if Day.mo Day.su then steps + 1 = Day.su.toNat - Day.mo.toNat else FalseDay.mo < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.mothis:if Day.tu Day.mo then steps + 1 = Day.mo.toNat - Day.tu.toNat else FalseDay.tu < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.tuthis:if Day.tu Day.tu then steps + 1 = Day.tu.toNat - Day.tu.toNat else FalseDay.tu < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.wethis:if Day.tu Day.we then steps + 1 = Day.we.toNat - Day.tu.toNat else FalseDay.tu < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.ththis:if Day.tu Day.th then steps + 1 = Day.th.toNat - Day.tu.toNat else FalseDay.tu < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.frthis:if Day.tu Day.fr then steps + 1 = Day.fr.toNat - Day.tu.toNat else FalseDay.tu < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.sathis:if Day.tu Day.sa then steps + 1 = Day.sa.toNat - Day.tu.toNat else FalseDay.tu < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.suthis:if Day.tu Day.su then steps + 1 = Day.su.toNat - Day.tu.toNat else FalseDay.tu < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.mothis:if Day.we Day.mo then steps + 1 = Day.mo.toNat - Day.we.toNat else FalseDay.we < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.tuthis:if Day.we Day.tu then steps + 1 = Day.tu.toNat - Day.we.toNat else FalseDay.we < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.wethis:if Day.we Day.we then steps + 1 = Day.we.toNat - Day.we.toNat else FalseDay.we < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.ththis:if Day.we Day.th then steps + 1 = Day.th.toNat - Day.we.toNat else FalseDay.we < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.frthis:if Day.we Day.fr then steps + 1 = Day.fr.toNat - Day.we.toNat else FalseDay.we < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.sathis:if Day.we Day.sa then steps + 1 = Day.sa.toNat - Day.we.toNat else FalseDay.we < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.suthis:if Day.we Day.su then steps + 1 = Day.su.toNat - Day.we.toNat else FalseDay.we < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.mothis:if Day.th Day.mo then steps + 1 = Day.mo.toNat - Day.th.toNat else FalseDay.th < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.tuthis:if Day.th Day.tu then steps + 1 = Day.tu.toNat - Day.th.toNat else FalseDay.th < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.wethis:if Day.th Day.we then steps + 1 = Day.we.toNat - Day.th.toNat else FalseDay.th < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.ththis:if Day.th Day.th then steps + 1 = Day.th.toNat - Day.th.toNat else FalseDay.th < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.frthis:if Day.th Day.fr then steps + 1 = Day.fr.toNat - Day.th.toNat else FalseDay.th < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.sathis:if Day.th Day.sa then steps + 1 = Day.sa.toNat - Day.th.toNat else FalseDay.th < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.suthis:if Day.th Day.su then steps + 1 = Day.su.toNat - Day.th.toNat else FalseDay.th < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.mothis:if Day.fr Day.mo then steps + 1 = Day.mo.toNat - Day.fr.toNat else FalseDay.fr < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.tuthis:if Day.fr Day.tu then steps + 1 = Day.tu.toNat - Day.fr.toNat else FalseDay.fr < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.wethis:if Day.fr Day.we then steps + 1 = Day.we.toNat - Day.fr.toNat else FalseDay.fr < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.ththis:if Day.fr Day.th then steps + 1 = Day.th.toNat - Day.fr.toNat else FalseDay.fr < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.frthis:if Day.fr Day.fr then steps + 1 = Day.fr.toNat - Day.fr.toNat else FalseDay.fr < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.sathis:if Day.fr Day.sa then steps + 1 = Day.sa.toNat - Day.fr.toNat else FalseDay.fr < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.suthis:if Day.fr Day.su then steps + 1 = Day.su.toNat - Day.fr.toNat else FalseDay.fr < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.mothis:if Day.sa Day.mo then steps + 1 = Day.mo.toNat - Day.sa.toNat else FalseDay.sa < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.tuthis:if Day.sa Day.tu then steps + 1 = Day.tu.toNat - Day.sa.toNat else FalseDay.sa < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.wethis:if Day.sa Day.we then steps + 1 = Day.we.toNat - Day.sa.toNat else FalseDay.sa < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.ththis:if Day.sa Day.th then steps + 1 = Day.th.toNat - Day.sa.toNat else FalseDay.sa < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.frthis:if Day.sa Day.fr then steps + 1 = Day.fr.toNat - Day.sa.toNat else FalseDay.sa < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.sathis:if Day.sa Day.sa then steps + 1 = Day.sa.toNat - Day.sa.toNat else FalseDay.sa < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.suthis:if Day.sa Day.su then steps + 1 = Day.su.toNat - Day.sa.toNat else FalseDay.sa < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.mothis:if Day.su Day.mo then steps + 1 = Day.mo.toNat - Day.su.toNat else FalseDay.su < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.tuthis:if Day.su Day.tu then steps + 1 = Day.tu.toNat - Day.su.toNat else FalseDay.su < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.wethis:if Day.su Day.we then steps + 1 = Day.we.toNat - Day.su.toNat else FalseDay.su < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.ththis:if Day.su Day.th then steps + 1 = Day.th.toNat - Day.su.toNat else FalseDay.su < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.frthis:if Day.su Day.fr then steps + 1 = Day.fr.toNat - Day.su.toNat else FalseDay.su < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.sathis:if Day.su Day.sa then steps + 1 = Day.sa.toNat - Day.su.toNat else FalseDay.su < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.suthis:if Day.su Day.su then steps + 1 = Day.su.toNat - Day.su.toNat else FalseDay.su < Day.su steps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.suthis:Day.su Day.su steps + 1 = Day.su.toNat - Day.su.toNatDay.su < Day.su steps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.mothis:Day.mo Day.mo steps + 1 = Day.mo.toNat - Day.mo.toNatDay.mo < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.tuthis:Day.mo Day.tu steps + 1 = Day.tu.toNat - Day.mo.toNatDay.mo < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.wethis:Day.mo Day.we steps + 1 = Day.we.toNat - Day.mo.toNatDay.mo < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.ththis:Day.mo Day.th steps + 1 = Day.th.toNat - Day.mo.toNatDay.mo < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.frthis:Day.mo Day.fr steps + 1 = Day.fr.toNat - Day.mo.toNatDay.mo < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.sathis:Day.mo Day.sa steps + 1 = Day.sa.toNat - Day.mo.toNatDay.mo < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.suthis:Day.mo Day.su steps + 1 = Day.su.toNat - Day.mo.toNatDay.mo < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.mothis:Day.tu Day.mo steps + 1 = Day.mo.toNat - Day.tu.toNatDay.tu < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.tuthis:Day.tu Day.tu steps + 1 = Day.tu.toNat - Day.tu.toNatDay.tu < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.wethis:Day.tu Day.we steps + 1 = Day.we.toNat - Day.tu.toNatDay.tu < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.ththis:Day.tu Day.th steps + 1 = Day.th.toNat - Day.tu.toNatDay.tu < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.frthis:Day.tu Day.fr steps + 1 = Day.fr.toNat - Day.tu.toNatDay.tu < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.sathis:Day.tu Day.sa steps + 1 = Day.sa.toNat - Day.tu.toNatDay.tu < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.suthis:Day.tu Day.su steps + 1 = Day.su.toNat - Day.tu.toNatDay.tu < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.mothis:Day.we Day.mo steps + 1 = Day.mo.toNat - Day.we.toNatDay.we < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.tuthis:Day.we Day.tu steps + 1 = Day.tu.toNat - Day.we.toNatDay.we < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.wethis:Day.we Day.we steps + 1 = Day.we.toNat - Day.we.toNatDay.we < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.ththis:Day.we Day.th steps + 1 = Day.th.toNat - Day.we.toNatDay.we < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.frthis:Day.we Day.fr steps + 1 = Day.fr.toNat - Day.we.toNatDay.we < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.sathis:Day.we Day.sa steps + 1 = Day.sa.toNat - Day.we.toNatDay.we < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.suthis:Day.we Day.su steps + 1 = Day.su.toNat - Day.we.toNatDay.we < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.mothis:Day.th Day.mo steps + 1 = Day.mo.toNat - Day.th.toNatDay.th < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.tuthis:Day.th Day.tu steps + 1 = Day.tu.toNat - Day.th.toNatDay.th < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.wethis:Day.th Day.we steps + 1 = Day.we.toNat - Day.th.toNatDay.th < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.ththis:Day.th Day.th steps + 1 = Day.th.toNat - Day.th.toNatDay.th < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.frthis:Day.th Day.fr steps + 1 = Day.fr.toNat - Day.th.toNatDay.th < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.sathis:Day.th Day.sa steps + 1 = Day.sa.toNat - Day.th.toNatDay.th < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.suthis:Day.th Day.su steps + 1 = Day.su.toNat - Day.th.toNatDay.th < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.mothis:Day.fr Day.mo steps + 1 = Day.mo.toNat - Day.fr.toNatDay.fr < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.tuthis:Day.fr Day.tu steps + 1 = Day.tu.toNat - Day.fr.toNatDay.fr < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.wethis:Day.fr Day.we steps + 1 = Day.we.toNat - Day.fr.toNatDay.fr < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.ththis:Day.fr Day.th steps + 1 = Day.th.toNat - Day.fr.toNatDay.fr < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.frthis:Day.fr Day.fr steps + 1 = Day.fr.toNat - Day.fr.toNatDay.fr < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.sathis:Day.fr Day.sa steps + 1 = Day.sa.toNat - Day.fr.toNatDay.fr < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.suthis:Day.fr Day.su steps + 1 = Day.su.toNat - Day.fr.toNatDay.fr < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.mothis:Day.sa Day.mo steps + 1 = Day.mo.toNat - Day.sa.toNatDay.sa < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.tuthis:Day.sa Day.tu steps + 1 = Day.tu.toNat - Day.sa.toNatDay.sa < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.wethis:Day.sa Day.we steps + 1 = Day.we.toNat - Day.sa.toNatDay.sa < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.ththis:Day.sa Day.th steps + 1 = Day.th.toNat - Day.sa.toNatDay.sa < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.frthis:Day.sa Day.fr steps + 1 = Day.fr.toNat - Day.sa.toNatDay.sa < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.sathis:Day.sa Day.sa steps + 1 = Day.sa.toNat - Day.sa.toNatDay.sa < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.suthis:Day.sa Day.su steps + 1 = Day.su.toNat - Day.sa.toNatDay.sa < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.mothis:Day.su Day.mo steps + 1 = Day.mo.toNat - Day.su.toNatDay.su < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.tuthis:Day.su Day.tu steps + 1 = Day.tu.toNat - Day.su.toNatDay.su < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.wethis:Day.su Day.we steps + 1 = Day.we.toNat - Day.su.toNatDay.su < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.ththis:Day.su Day.th steps + 1 = Day.th.toNat - Day.su.toNatDay.su < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.frthis:Day.su Day.fr steps + 1 = Day.fr.toNat - Day.su.toNatDay.su < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.sathis:Day.su Day.sa steps + 1 = Day.sa.toNat - Day.su.toNatDay.su < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.suthis:Day.su Day.su steps + 1 = Day.su.toNat - Day.su.toNatDay.su < Day.su steps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.suleft✝:Day.su Day.suright✝:steps + 1 = Day.su.toNat - Day.su.toNatDay.su < Day.su steps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.moleft✝:Day.mo Day.moright✝:steps + 1 = Day.mo.toNat - Day.mo.toNatDay.mo < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.tuleft✝:Day.mo Day.turight✝:steps + 1 = Day.tu.toNat - Day.mo.toNatDay.mo < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.weleft✝:Day.mo Day.weright✝:steps + 1 = Day.we.toNat - Day.mo.toNatDay.mo < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.thleft✝:Day.mo Day.thright✝:steps + 1 = Day.th.toNat - Day.mo.toNatDay.mo < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.frleft✝:Day.mo Day.frright✝:steps + 1 = Day.fr.toNat - Day.mo.toNatDay.mo < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.saleft✝:Day.mo Day.saright✝:steps + 1 = Day.sa.toNat - Day.mo.toNatDay.mo < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.mo = some Day.suleft✝:Day.mo Day.suright✝:steps + 1 = Day.su.toNat - Day.mo.toNatDay.mo < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.moleft✝:Day.tu Day.moright✝:steps + 1 = Day.mo.toNat - Day.tu.toNatDay.tu < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.tuleft✝:Day.tu Day.turight✝:steps + 1 = Day.tu.toNat - Day.tu.toNatDay.tu < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.weleft✝:Day.tu Day.weright✝:steps + 1 = Day.we.toNat - Day.tu.toNatDay.tu < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.thleft✝:Day.tu Day.thright✝:steps + 1 = Day.th.toNat - Day.tu.toNatDay.tu < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.frleft✝:Day.tu Day.frright✝:steps + 1 = Day.fr.toNat - Day.tu.toNatDay.tu < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.saleft✝:Day.tu Day.saright✝:steps + 1 = Day.sa.toNat - Day.tu.toNatDay.tu < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.tu = some Day.suleft✝:Day.tu Day.suright✝:steps + 1 = Day.su.toNat - Day.tu.toNatDay.tu < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.moleft✝:Day.we Day.moright✝:steps + 1 = Day.mo.toNat - Day.we.toNatDay.we < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.tuleft✝:Day.we Day.turight✝:steps + 1 = Day.tu.toNat - Day.we.toNatDay.we < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.weleft✝:Day.we Day.weright✝:steps + 1 = Day.we.toNat - Day.we.toNatDay.we < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.thleft✝:Day.we Day.thright✝:steps + 1 = Day.th.toNat - Day.we.toNatDay.we < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.frleft✝:Day.we Day.frright✝:steps + 1 = Day.fr.toNat - Day.we.toNatDay.we < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.saleft✝:Day.we Day.saright✝:steps + 1 = Day.sa.toNat - Day.we.toNatDay.we < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.we = some Day.suleft✝:Day.we Day.suright✝:steps + 1 = Day.su.toNat - Day.we.toNatDay.we < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.moleft✝:Day.th Day.moright✝:steps + 1 = Day.mo.toNat - Day.th.toNatDay.th < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.tuleft✝:Day.th Day.turight✝:steps + 1 = Day.tu.toNat - Day.th.toNatDay.th < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.weleft✝:Day.th Day.weright✝:steps + 1 = Day.we.toNat - Day.th.toNatDay.th < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.thleft✝:Day.th Day.thright✝:steps + 1 = Day.th.toNat - Day.th.toNatDay.th < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.frleft✝:Day.th Day.frright✝:steps + 1 = Day.fr.toNat - Day.th.toNatDay.th < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.saleft✝:Day.th Day.saright✝:steps + 1 = Day.sa.toNat - Day.th.toNatDay.th < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.th = some Day.suleft✝:Day.th Day.suright✝:steps + 1 = Day.su.toNat - Day.th.toNatDay.th < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.moleft✝:Day.fr Day.moright✝:steps + 1 = Day.mo.toNat - Day.fr.toNatDay.fr < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.tuleft✝:Day.fr Day.turight✝:steps + 1 = Day.tu.toNat - Day.fr.toNatDay.fr < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.weleft✝:Day.fr Day.weright✝:steps + 1 = Day.we.toNat - Day.fr.toNatDay.fr < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.thleft✝:Day.fr Day.thright✝:steps + 1 = Day.th.toNat - Day.fr.toNatDay.fr < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.frleft✝:Day.fr Day.frright✝:steps + 1 = Day.fr.toNat - Day.fr.toNatDay.fr < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.saleft✝:Day.fr Day.saright✝:steps + 1 = Day.sa.toNat - Day.fr.toNatDay.fr < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.fr = some Day.suleft✝:Day.fr Day.suright✝:steps + 1 = Day.su.toNat - Day.fr.toNatDay.fr < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.moleft✝:Day.sa Day.moright✝:steps + 1 = Day.mo.toNat - Day.sa.toNatDay.sa < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.tuleft✝:Day.sa Day.turight✝:steps + 1 = Day.tu.toNat - Day.sa.toNatDay.sa < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.weleft✝:Day.sa Day.weright✝:steps + 1 = Day.we.toNat - Day.sa.toNatDay.sa < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.thleft✝:Day.sa Day.thright✝:steps + 1 = Day.th.toNat - Day.sa.toNatDay.sa < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.frleft✝:Day.sa Day.frright✝:steps + 1 = Day.fr.toNat - Day.sa.toNatDay.sa < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.saleft✝:Day.sa Day.saright✝:steps + 1 = Day.sa.toNat - Day.sa.toNatDay.sa < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.sa = some Day.suleft✝:Day.sa Day.suright✝:steps + 1 = Day.su.toNat - Day.sa.toNatDay.sa < Day.susteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.moleft✝:Day.su Day.moright✝:steps + 1 = Day.mo.toNat - Day.su.toNatDay.su < Day.mosteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.tuleft✝:Day.su Day.turight✝:steps + 1 = Day.tu.toNat - Day.su.toNatDay.su < Day.tusteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.weleft✝:Day.su Day.weright✝:steps + 1 = Day.we.toNat - Day.su.toNatDay.su < Day.westeps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.thleft✝:Day.su Day.thright✝:steps + 1 = Day.th.toNat - Day.su.toNatDay.su < Day.thsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.frleft✝:Day.su Day.frright✝:steps + 1 = Day.fr.toNat - Day.su.toNatDay.su < Day.frsteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.saleft✝:Day.su Day.saright✝:steps + 1 = Day.sa.toNat - Day.su.toNatDay.su < Day.sasteps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.suleft✝:Day.su Day.suright✝:steps + 1 = Day.su.toNat - Day.su.toNatDay.su < Day.su first | steps:Nateq:Std.PRange.succMany? (steps + 1) Day.su = some Day.suleft✝:Day.su Day.suright✝:steps + 1 = Day.su.toNat - Day.su.toNatDay.su < Day.su | All goals completed! 🐙 instance : Std.PRange.LawfulUpwardEnumerableLE Day where le_iff d1 d2 := d1:Dayd2:Dayd1 d2 Std.PRange.UpwardEnumerable.LE d1 d2 d1:Dayd2:Dayd1 d2 Std.PRange.UpwardEnumerable.LE d1 d2d1:Dayd2:DayStd.PRange.UpwardEnumerable.LE d1 d2 d1 d2 d1:Dayd2:Dayd1 d2 Std.PRange.UpwardEnumerable.LE d1 d2 d1:Dayd2:Dayle:d1 d2Std.PRange.UpwardEnumerable.LE d1 d2 d1:Dayd2:Dayle:d1 d2 n, Std.PRange.succMany? n d1 = some d2 d1:Dayd2:Dayle:d1 d2Std.PRange.succMany? (d2.toNat - d1.toNat) d1 = some d2 d2:Dayle:Day.mo d2Std.PRange.succMany? (d2.toNat - Day.mo.toNat) Day.mo = some d2d2:Dayle:Day.tu d2Std.PRange.succMany? (d2.toNat - Day.tu.toNat) Day.tu = some d2d2:Dayle:Day.we d2Std.PRange.succMany? (d2.toNat - Day.we.toNat) Day.we = some d2d2:Dayle:Day.th d2Std.PRange.succMany? (d2.toNat - Day.th.toNat) Day.th = some d2d2:Dayle:Day.fr d2Std.PRange.succMany? (d2.toNat - Day.fr.toNat) Day.fr = some d2d2:Dayle:Day.sa d2Std.PRange.succMany? (d2.toNat - Day.sa.toNat) Day.sa = some d2d2:Dayle:Day.su d2Std.PRange.succMany? (d2.toNat - Day.su.toNat) Day.su = some d2 d2:Dayle:Day.mo d2Std.PRange.succMany? (d2.toNat - Day.mo.toNat) Day.mo = some d2d2:Dayle:Day.tu d2Std.PRange.succMany? (d2.toNat - Day.tu.toNat) Day.tu = some d2d2:Dayle:Day.we d2Std.PRange.succMany? (d2.toNat - Day.we.toNat) Day.we = some d2d2:Dayle:Day.th d2Std.PRange.succMany? (d2.toNat - Day.th.toNat) Day.th = some d2d2:Dayle:Day.fr d2Std.PRange.succMany? (d2.toNat - Day.fr.toNat) Day.fr = some d2d2:Dayle:Day.sa d2Std.PRange.succMany? (d2.toNat - Day.sa.toNat) Day.sa = some d2d2:Dayle:Day.su d2Std.PRange.succMany? (d2.toNat - Day.su.toNat) Day.su = some d2 le:Day.su Day.moStd.PRange.succMany? (Day.mo.toNat - Day.su.toNat) Day.su = some Day.mole:Day.su Day.tuStd.PRange.succMany? (Day.tu.toNat - Day.su.toNat) Day.su = some Day.tule:Day.su Day.weStd.PRange.succMany? (Day.we.toNat - Day.su.toNat) Day.su = some Day.wele:Day.su Day.thStd.PRange.succMany? (Day.th.toNat - Day.su.toNat) Day.su = some Day.thle:Day.su Day.frStd.PRange.succMany? (Day.fr.toNat - Day.su.toNat) Day.su = some Day.frle:Day.su Day.saStd.PRange.succMany? (Day.sa.toNat - Day.su.toNat) Day.su = some Day.sale:Day.su Day.suStd.PRange.succMany? (Day.su.toNat - Day.su.toNat) Day.su = some Day.su le:Day.mo Day.moStd.PRange.succMany? (Day.mo.toNat - Day.mo.toNat) Day.mo = some Day.mole:Day.mo Day.tuStd.PRange.succMany? (Day.tu.toNat - Day.mo.toNat) Day.mo = some Day.tule:Day.mo Day.weStd.PRange.succMany? (Day.we.toNat - Day.mo.toNat) Day.mo = some Day.wele:Day.mo Day.thStd.PRange.succMany? (Day.th.toNat - Day.mo.toNat) Day.mo = some Day.thle:Day.mo Day.frStd.PRange.succMany? (Day.fr.toNat - Day.mo.toNat) Day.mo = some Day.frle:Day.mo Day.saStd.PRange.succMany? (Day.sa.toNat - Day.mo.toNat) Day.mo = some Day.sale:Day.mo Day.suStd.PRange.succMany? (Day.su.toNat - Day.mo.toNat) Day.mo = some Day.sule:Day.tu Day.moStd.PRange.succMany? (Day.mo.toNat - Day.tu.toNat) Day.tu = some Day.mole:Day.tu Day.tuStd.PRange.succMany? (Day.tu.toNat - Day.tu.toNat) Day.tu = some Day.tule:Day.tu Day.weStd.PRange.succMany? (Day.we.toNat - Day.tu.toNat) Day.tu = some Day.wele:Day.tu Day.thStd.PRange.succMany? (Day.th.toNat - Day.tu.toNat) Day.tu = some Day.thle:Day.tu Day.frStd.PRange.succMany? (Day.fr.toNat - Day.tu.toNat) Day.tu = some Day.frle:Day.tu Day.saStd.PRange.succMany? (Day.sa.toNat - Day.tu.toNat) Day.tu = some Day.sale:Day.tu Day.suStd.PRange.succMany? (Day.su.toNat - Day.tu.toNat) Day.tu = some Day.sule:Day.we Day.moStd.PRange.succMany? (Day.mo.toNat - Day.we.toNat) Day.we = some Day.mole:Day.we Day.tuStd.PRange.succMany? (Day.tu.toNat - Day.we.toNat) Day.we = some Day.tule:Day.we Day.weStd.PRange.succMany? (Day.we.toNat - Day.we.toNat) Day.we = some Day.wele:Day.we Day.thStd.PRange.succMany? (Day.th.toNat - Day.we.toNat) Day.we = some Day.thle:Day.we Day.frStd.PRange.succMany? (Day.fr.toNat - Day.we.toNat) Day.we = some Day.frle:Day.we Day.saStd.PRange.succMany? (Day.sa.toNat - Day.we.toNat) Day.we = some Day.sale:Day.we Day.suStd.PRange.succMany? (Day.su.toNat - Day.we.toNat) Day.we = some Day.sule:Day.th Day.moStd.PRange.succMany? (Day.mo.toNat - Day.th.toNat) Day.th = some Day.mole:Day.th Day.tuStd.PRange.succMany? (Day.tu.toNat - Day.th.toNat) Day.th = some Day.tule:Day.th Day.weStd.PRange.succMany? (Day.we.toNat - Day.th.toNat) Day.th = some Day.wele:Day.th Day.thStd.PRange.succMany? (Day.th.toNat - Day.th.toNat) Day.th = some Day.thle:Day.th Day.frStd.PRange.succMany? (Day.fr.toNat - Day.th.toNat) Day.th = some Day.frle:Day.th Day.saStd.PRange.succMany? (Day.sa.toNat - Day.th.toNat) Day.th = some Day.sale:Day.th Day.suStd.PRange.succMany? (Day.su.toNat - Day.th.toNat) Day.th = some Day.sule:Day.fr Day.moStd.PRange.succMany? (Day.mo.toNat - Day.fr.toNat) Day.fr = some Day.mole:Day.fr Day.tuStd.PRange.succMany? (Day.tu.toNat - Day.fr.toNat) Day.fr = some Day.tule:Day.fr Day.weStd.PRange.succMany? (Day.we.toNat - Day.fr.toNat) Day.fr = some Day.wele:Day.fr Day.thStd.PRange.succMany? (Day.th.toNat - Day.fr.toNat) Day.fr = some Day.thle:Day.fr Day.frStd.PRange.succMany? (Day.fr.toNat - Day.fr.toNat) Day.fr = some Day.frle:Day.fr Day.saStd.PRange.succMany? (Day.sa.toNat - Day.fr.toNat) Day.fr = some Day.sale:Day.fr Day.suStd.PRange.succMany? (Day.su.toNat - Day.fr.toNat) Day.fr = some Day.sule:Day.sa Day.moStd.PRange.succMany? (Day.mo.toNat - Day.sa.toNat) Day.sa = some Day.mole:Day.sa Day.tuStd.PRange.succMany? (Day.tu.toNat - Day.sa.toNat) Day.sa = some Day.tule:Day.sa Day.weStd.PRange.succMany? (Day.we.toNat - Day.sa.toNat) Day.sa = some Day.wele:Day.sa Day.thStd.PRange.succMany? (Day.th.toNat - Day.sa.toNat) Day.sa = some Day.thle:Day.sa Day.frStd.PRange.succMany? (Day.fr.toNat - Day.sa.toNat) Day.sa = some Day.frle:Day.sa Day.saStd.PRange.succMany? (Day.sa.toNat - Day.sa.toNat) Day.sa = some Day.sale:Day.sa Day.suStd.PRange.succMany? (Day.su.toNat - Day.sa.toNat) Day.sa = some Day.sule:Day.su Day.moStd.PRange.succMany? (Day.mo.toNat - Day.su.toNat) Day.su = some Day.mole:Day.su Day.tuStd.PRange.succMany? (Day.tu.toNat - Day.su.toNat) Day.su = some Day.tule:Day.su Day.weStd.PRange.succMany? (Day.we.toNat - Day.su.toNat) Day.su = some Day.wele:Day.su Day.thStd.PRange.succMany? (Day.th.toNat - Day.su.toNat) Day.su = some Day.thle:Day.su Day.frStd.PRange.succMany? (Day.fr.toNat - Day.su.toNat) Day.su = some Day.frle:Day.su Day.saStd.PRange.succMany? (Day.sa.toNat - Day.su.toNat) Day.su = some Day.sale:Day.su Day.suStd.PRange.succMany? (Day.su.toNat - Day.su.toNat) Day.su = some Day.su All goals completed! 🐙 le:Day.tu Day.moFalsele:Day.we Day.moFalsele:Day.we Day.tuFalsele:Day.th Day.moFalsele:Day.th Day.tuFalsele:Day.th Day.weFalsele:Day.fr Day.moFalsele:Day.fr Day.tuFalsele:Day.fr Day.weFalsele:Day.fr Day.thFalsele:Day.sa Day.moFalsele:Day.sa Day.tuFalsele:Day.sa Day.weFalsele:Day.sa Day.thFalsele:Day.sa Day.frFalsele:Day.su Day.moFalsele:Day.su Day.tuFalsele:Day.su Day.weFalsele:Day.su Day.thFalsele:Day.su Day.frFalsele:Day.su Day.saFalse All goals completed! 🐙 d1:Dayd2:DayStd.PRange.UpwardEnumerable.LE d1 d2 d1 d2 d1:Dayd2:Daysteps:Nateq:Std.PRange.succMany? steps d1 = some d2d1 d2 d1:Dayd2:Daysteps:Nateq:Std.PRange.succMany? steps d1 = some d2this:if d1 d2 then steps = d2.toNat - d1.toNat else Falsed1 d2 d2:Daysteps:Nateq:Std.PRange.succMany? steps Day.mo = some d2this:if Day.mo d2 then steps = d2.toNat - Day.mo.toNat else FalseDay.mo d2d2:Daysteps:Nateq:Std.PRange.succMany? steps Day.tu = some d2this:if Day.tu d2 then steps = d2.toNat - Day.tu.toNat else FalseDay.tu d2d2:Daysteps:Nateq:Std.PRange.succMany? steps Day.we = some d2this:if Day.we d2 then steps = d2.toNat - Day.we.toNat else FalseDay.we d2d2:Daysteps:Nateq:Std.PRange.succMany? steps Day.th = some d2this:if Day.th d2 then steps = d2.toNat - Day.th.toNat else FalseDay.th d2d2:Daysteps:Nateq:Std.PRange.succMany? steps Day.fr = some d2this:if Day.fr d2 then steps = d2.toNat - Day.fr.toNat else FalseDay.fr d2d2:Daysteps:Nateq:Std.PRange.succMany? steps Day.sa = some d2this:if Day.sa d2 then steps = d2.toNat - Day.sa.toNat else FalseDay.sa d2d2:Daysteps:Nateq:Std.PRange.succMany? steps Day.su = some d2this:if Day.su d2 then steps = d2.toNat - Day.su.toNat else FalseDay.su d2 d2:Daysteps:Nateq:Std.PRange.succMany? steps Day.mo = some d2this:if Day.mo d2 then steps = d2.toNat - Day.mo.toNat else FalseDay.mo d2d2:Daysteps:Nateq:Std.PRange.succMany? steps Day.tu = some d2this:if Day.tu d2 then steps = d2.toNat - Day.tu.toNat else FalseDay.tu d2d2:Daysteps:Nateq:Std.PRange.succMany? steps Day.we = some d2this:if Day.we d2 then steps = d2.toNat - Day.we.toNat else FalseDay.we d2d2:Daysteps:Nateq:Std.PRange.succMany? steps Day.th = some d2this:if Day.th d2 then steps = d2.toNat - Day.th.toNat else FalseDay.th d2d2:Daysteps:Nateq:Std.PRange.succMany? steps Day.fr = some d2this:if Day.fr d2 then steps = d2.toNat - Day.fr.toNat else FalseDay.fr d2d2:Daysteps:Nateq:Std.PRange.succMany? steps Day.sa = some d2this:if Day.sa d2 then steps = d2.toNat - Day.sa.toNat else FalseDay.sa d2d2:Daysteps:Nateq:Std.PRange.succMany? steps Day.su = some d2this:if Day.su d2 then steps = d2.toNat - Day.su.toNat else FalseDay.su d2 steps:Nateq:Std.PRange.succMany? steps Day.su = some Day.mothis:if Day.su Day.mo then steps = Day.mo.toNat - Day.su.toNat else FalseDay.su Day.mosteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.tuthis:if Day.su Day.tu then steps = Day.tu.toNat - Day.su.toNat else FalseDay.su Day.tusteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.wethis:if Day.su Day.we then steps = Day.we.toNat - Day.su.toNat else FalseDay.su Day.westeps:Nateq:Std.PRange.succMany? steps Day.su = some Day.ththis:if Day.su Day.th then steps = Day.th.toNat - Day.su.toNat else FalseDay.su Day.thsteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.frthis:if Day.su Day.fr then steps = Day.fr.toNat - Day.su.toNat else FalseDay.su Day.frsteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.sathis:if Day.su Day.sa then steps = Day.sa.toNat - Day.su.toNat else FalseDay.su Day.sasteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.suthis:if Day.su Day.su then steps = Day.su.toNat - Day.su.toNat else FalseDay.su Day.su steps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.mothis:if Day.mo Day.mo then steps = Day.mo.toNat - Day.mo.toNat else FalseDay.mo Day.mosteps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.tuthis:if Day.mo Day.tu then steps = Day.tu.toNat - Day.mo.toNat else FalseDay.mo Day.tusteps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.wethis:if Day.mo Day.we then steps = Day.we.toNat - Day.mo.toNat else FalseDay.mo Day.westeps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.ththis:if Day.mo Day.th then steps = Day.th.toNat - Day.mo.toNat else FalseDay.mo Day.thsteps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.frthis:if Day.mo Day.fr then steps = Day.fr.toNat - Day.mo.toNat else FalseDay.mo Day.frsteps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.sathis:if Day.mo Day.sa then steps = Day.sa.toNat - Day.mo.toNat else FalseDay.mo Day.sasteps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.suthis:if Day.mo Day.su then steps = Day.su.toNat - Day.mo.toNat else FalseDay.mo Day.susteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.mothis:if Day.tu Day.mo then steps = Day.mo.toNat - Day.tu.toNat else FalseDay.tu Day.mosteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.tuthis:if Day.tu Day.tu then steps = Day.tu.toNat - Day.tu.toNat else FalseDay.tu Day.tusteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.wethis:if Day.tu Day.we then steps = Day.we.toNat - Day.tu.toNat else FalseDay.tu Day.westeps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.ththis:if Day.tu Day.th then steps = Day.th.toNat - Day.tu.toNat else FalseDay.tu Day.thsteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.frthis:if Day.tu Day.fr then steps = Day.fr.toNat - Day.tu.toNat else FalseDay.tu Day.frsteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.sathis:if Day.tu Day.sa then steps = Day.sa.toNat - Day.tu.toNat else FalseDay.tu Day.sasteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.suthis:if Day.tu Day.su then steps = Day.su.toNat - Day.tu.toNat else FalseDay.tu Day.susteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.mothis:if Day.we Day.mo then steps = Day.mo.toNat - Day.we.toNat else FalseDay.we Day.mosteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.tuthis:if Day.we Day.tu then steps = Day.tu.toNat - Day.we.toNat else FalseDay.we Day.tusteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.wethis:if Day.we Day.we then steps = Day.we.toNat - Day.we.toNat else FalseDay.we Day.westeps:Nateq:Std.PRange.succMany? steps Day.we = some Day.ththis:if Day.we Day.th then steps = Day.th.toNat - Day.we.toNat else FalseDay.we Day.thsteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.frthis:if Day.we Day.fr then steps = Day.fr.toNat - Day.we.toNat else FalseDay.we Day.frsteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.sathis:if Day.we Day.sa then steps = Day.sa.toNat - Day.we.toNat else FalseDay.we Day.sasteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.suthis:if Day.we Day.su then steps = Day.su.toNat - Day.we.toNat else FalseDay.we Day.susteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.mothis:if Day.th Day.mo then steps = Day.mo.toNat - Day.th.toNat else FalseDay.th Day.mosteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.tuthis:if Day.th Day.tu then steps = Day.tu.toNat - Day.th.toNat else FalseDay.th Day.tusteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.wethis:if Day.th Day.we then steps = Day.we.toNat - Day.th.toNat else FalseDay.th Day.westeps:Nateq:Std.PRange.succMany? steps Day.th = some Day.ththis:if Day.th Day.th then steps = Day.th.toNat - Day.th.toNat else FalseDay.th Day.thsteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.frthis:if Day.th Day.fr then steps = Day.fr.toNat - Day.th.toNat else FalseDay.th Day.frsteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.sathis:if Day.th Day.sa then steps = Day.sa.toNat - Day.th.toNat else FalseDay.th Day.sasteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.suthis:if Day.th Day.su then steps = Day.su.toNat - Day.th.toNat else FalseDay.th Day.susteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.mothis:if Day.fr Day.mo then steps = Day.mo.toNat - Day.fr.toNat else FalseDay.fr Day.mosteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.tuthis:if Day.fr Day.tu then steps = Day.tu.toNat - Day.fr.toNat else FalseDay.fr Day.tusteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.wethis:if Day.fr Day.we then steps = Day.we.toNat - Day.fr.toNat else FalseDay.fr Day.westeps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.ththis:if Day.fr Day.th then steps = Day.th.toNat - Day.fr.toNat else FalseDay.fr Day.thsteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.frthis:if Day.fr Day.fr then steps = Day.fr.toNat - Day.fr.toNat else FalseDay.fr Day.frsteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.sathis:if Day.fr Day.sa then steps = Day.sa.toNat - Day.fr.toNat else FalseDay.fr Day.sasteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.suthis:if Day.fr Day.su then steps = Day.su.toNat - Day.fr.toNat else FalseDay.fr Day.susteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.mothis:if Day.sa Day.mo then steps = Day.mo.toNat - Day.sa.toNat else FalseDay.sa Day.mosteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.tuthis:if Day.sa Day.tu then steps = Day.tu.toNat - Day.sa.toNat else FalseDay.sa Day.tusteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.wethis:if Day.sa Day.we then steps = Day.we.toNat - Day.sa.toNat else FalseDay.sa Day.westeps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.ththis:if Day.sa Day.th then steps = Day.th.toNat - Day.sa.toNat else FalseDay.sa Day.thsteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.frthis:if Day.sa Day.fr then steps = Day.fr.toNat - Day.sa.toNat else FalseDay.sa Day.frsteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.sathis:if Day.sa Day.sa then steps = Day.sa.toNat - Day.sa.toNat else FalseDay.sa Day.sasteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.suthis:if Day.sa Day.su then steps = Day.su.toNat - Day.sa.toNat else FalseDay.sa Day.susteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.mothis:if Day.su Day.mo then steps = Day.mo.toNat - Day.su.toNat else FalseDay.su Day.mosteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.tuthis:if Day.su Day.tu then steps = Day.tu.toNat - Day.su.toNat else FalseDay.su Day.tusteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.wethis:if Day.su Day.we then steps = Day.we.toNat - Day.su.toNat else FalseDay.su Day.westeps:Nateq:Std.PRange.succMany? steps Day.su = some Day.ththis:if Day.su Day.th then steps = Day.th.toNat - Day.su.toNat else FalseDay.su Day.thsteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.frthis:if Day.su Day.fr then steps = Day.fr.toNat - Day.su.toNat else FalseDay.su Day.frsteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.sathis:if Day.su Day.sa then steps = Day.sa.toNat - Day.su.toNat else FalseDay.su Day.sasteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.suthis:if Day.su Day.su then steps = Day.su.toNat - Day.su.toNat else FalseDay.su Day.su steps:Nateq:Std.PRange.succMany? steps Day.su = some Day.suthis:Day.su Day.su steps = Day.su.toNat - Day.su.toNatDay.su Day.su steps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.mothis:Day.mo Day.mo steps = Day.mo.toNat - Day.mo.toNatDay.mo Day.mosteps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.tuthis:Day.mo Day.tu steps = Day.tu.toNat - Day.mo.toNatDay.mo Day.tusteps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.wethis:Day.mo Day.we steps = Day.we.toNat - Day.mo.toNatDay.mo Day.westeps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.ththis:Day.mo Day.th steps = Day.th.toNat - Day.mo.toNatDay.mo Day.thsteps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.frthis:Day.mo Day.fr steps = Day.fr.toNat - Day.mo.toNatDay.mo Day.frsteps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.sathis:Day.mo Day.sa steps = Day.sa.toNat - Day.mo.toNatDay.mo Day.sasteps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.suthis:Day.mo Day.su steps = Day.su.toNat - Day.mo.toNatDay.mo Day.susteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.mothis:Day.tu Day.mo steps = Day.mo.toNat - Day.tu.toNatDay.tu Day.mosteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.tuthis:Day.tu Day.tu steps = Day.tu.toNat - Day.tu.toNatDay.tu Day.tusteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.wethis:Day.tu Day.we steps = Day.we.toNat - Day.tu.toNatDay.tu Day.westeps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.ththis:Day.tu Day.th steps = Day.th.toNat - Day.tu.toNatDay.tu Day.thsteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.frthis:Day.tu Day.fr steps = Day.fr.toNat - Day.tu.toNatDay.tu Day.frsteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.sathis:Day.tu Day.sa steps = Day.sa.toNat - Day.tu.toNatDay.tu Day.sasteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.suthis:Day.tu Day.su steps = Day.su.toNat - Day.tu.toNatDay.tu Day.susteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.mothis:Day.we Day.mo steps = Day.mo.toNat - Day.we.toNatDay.we Day.mosteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.tuthis:Day.we Day.tu steps = Day.tu.toNat - Day.we.toNatDay.we Day.tusteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.wethis:Day.we Day.we steps = Day.we.toNat - Day.we.toNatDay.we Day.westeps:Nateq:Std.PRange.succMany? steps Day.we = some Day.ththis:Day.we Day.th steps = Day.th.toNat - Day.we.toNatDay.we Day.thsteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.frthis:Day.we Day.fr steps = Day.fr.toNat - Day.we.toNatDay.we Day.frsteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.sathis:Day.we Day.sa steps = Day.sa.toNat - Day.we.toNatDay.we Day.sasteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.suthis:Day.we Day.su steps = Day.su.toNat - Day.we.toNatDay.we Day.susteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.mothis:Day.th Day.mo steps = Day.mo.toNat - Day.th.toNatDay.th Day.mosteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.tuthis:Day.th Day.tu steps = Day.tu.toNat - Day.th.toNatDay.th Day.tusteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.wethis:Day.th Day.we steps = Day.we.toNat - Day.th.toNatDay.th Day.westeps:Nateq:Std.PRange.succMany? steps Day.th = some Day.ththis:Day.th Day.th steps = Day.th.toNat - Day.th.toNatDay.th Day.thsteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.frthis:Day.th Day.fr steps = Day.fr.toNat - Day.th.toNatDay.th Day.frsteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.sathis:Day.th Day.sa steps = Day.sa.toNat - Day.th.toNatDay.th Day.sasteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.suthis:Day.th Day.su steps = Day.su.toNat - Day.th.toNatDay.th Day.susteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.mothis:Day.fr Day.mo steps = Day.mo.toNat - Day.fr.toNatDay.fr Day.mosteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.tuthis:Day.fr Day.tu steps = Day.tu.toNat - Day.fr.toNatDay.fr Day.tusteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.wethis:Day.fr Day.we steps = Day.we.toNat - Day.fr.toNatDay.fr Day.westeps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.ththis:Day.fr Day.th steps = Day.th.toNat - Day.fr.toNatDay.fr Day.thsteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.frthis:Day.fr Day.fr steps = Day.fr.toNat - Day.fr.toNatDay.fr Day.frsteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.sathis:Day.fr Day.sa steps = Day.sa.toNat - Day.fr.toNatDay.fr Day.sasteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.suthis:Day.fr Day.su steps = Day.su.toNat - Day.fr.toNatDay.fr Day.susteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.mothis:Day.sa Day.mo steps = Day.mo.toNat - Day.sa.toNatDay.sa Day.mosteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.tuthis:Day.sa Day.tu steps = Day.tu.toNat - Day.sa.toNatDay.sa Day.tusteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.wethis:Day.sa Day.we steps = Day.we.toNat - Day.sa.toNatDay.sa Day.westeps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.ththis:Day.sa Day.th steps = Day.th.toNat - Day.sa.toNatDay.sa Day.thsteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.frthis:Day.sa Day.fr steps = Day.fr.toNat - Day.sa.toNatDay.sa Day.frsteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.sathis:Day.sa Day.sa steps = Day.sa.toNat - Day.sa.toNatDay.sa Day.sasteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.suthis:Day.sa Day.su steps = Day.su.toNat - Day.sa.toNatDay.sa Day.susteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.mothis:Day.su Day.mo steps = Day.mo.toNat - Day.su.toNatDay.su Day.mosteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.tuthis:Day.su Day.tu steps = Day.tu.toNat - Day.su.toNatDay.su Day.tusteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.wethis:Day.su Day.we steps = Day.we.toNat - Day.su.toNatDay.su Day.westeps:Nateq:Std.PRange.succMany? steps Day.su = some Day.ththis:Day.su Day.th steps = Day.th.toNat - Day.su.toNatDay.su Day.thsteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.frthis:Day.su Day.fr steps = Day.fr.toNat - Day.su.toNatDay.su Day.frsteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.sathis:Day.su Day.sa steps = Day.sa.toNat - Day.su.toNatDay.su Day.sasteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.suthis:Day.su Day.su steps = Day.su.toNat - Day.su.toNatDay.su Day.su steps:Nateq:Std.PRange.succMany? steps Day.su = some Day.suleft✝:Day.su Day.suright✝:steps = Day.su.toNat - Day.su.toNatDay.su Day.su steps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.moleft✝:Day.mo Day.moright✝:steps = Day.mo.toNat - Day.mo.toNatDay.mo Day.mosteps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.tuleft✝:Day.mo Day.turight✝:steps = Day.tu.toNat - Day.mo.toNatDay.mo Day.tusteps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.weleft✝:Day.mo Day.weright✝:steps = Day.we.toNat - Day.mo.toNatDay.mo Day.westeps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.thleft✝:Day.mo Day.thright✝:steps = Day.th.toNat - Day.mo.toNatDay.mo Day.thsteps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.frleft✝:Day.mo Day.frright✝:steps = Day.fr.toNat - Day.mo.toNatDay.mo Day.frsteps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.saleft✝:Day.mo Day.saright✝:steps = Day.sa.toNat - Day.mo.toNatDay.mo Day.sasteps:Nateq:Std.PRange.succMany? steps Day.mo = some Day.suleft✝:Day.mo Day.suright✝:steps = Day.su.toNat - Day.mo.toNatDay.mo Day.susteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.moleft✝:Day.tu Day.moright✝:steps = Day.mo.toNat - Day.tu.toNatDay.tu Day.mosteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.tuleft✝:Day.tu Day.turight✝:steps = Day.tu.toNat - Day.tu.toNatDay.tu Day.tusteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.weleft✝:Day.tu Day.weright✝:steps = Day.we.toNat - Day.tu.toNatDay.tu Day.westeps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.thleft✝:Day.tu Day.thright✝:steps = Day.th.toNat - Day.tu.toNatDay.tu Day.thsteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.frleft✝:Day.tu Day.frright✝:steps = Day.fr.toNat - Day.tu.toNatDay.tu Day.frsteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.saleft✝:Day.tu Day.saright✝:steps = Day.sa.toNat - Day.tu.toNatDay.tu Day.sasteps:Nateq:Std.PRange.succMany? steps Day.tu = some Day.suleft✝:Day.tu Day.suright✝:steps = Day.su.toNat - Day.tu.toNatDay.tu Day.susteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.moleft✝:Day.we Day.moright✝:steps = Day.mo.toNat - Day.we.toNatDay.we Day.mosteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.tuleft✝:Day.we Day.turight✝:steps = Day.tu.toNat - Day.we.toNatDay.we Day.tusteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.weleft✝:Day.we Day.weright✝:steps = Day.we.toNat - Day.we.toNatDay.we Day.westeps:Nateq:Std.PRange.succMany? steps Day.we = some Day.thleft✝:Day.we Day.thright✝:steps = Day.th.toNat - Day.we.toNatDay.we Day.thsteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.frleft✝:Day.we Day.frright✝:steps = Day.fr.toNat - Day.we.toNatDay.we Day.frsteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.saleft✝:Day.we Day.saright✝:steps = Day.sa.toNat - Day.we.toNatDay.we Day.sasteps:Nateq:Std.PRange.succMany? steps Day.we = some Day.suleft✝:Day.we Day.suright✝:steps = Day.su.toNat - Day.we.toNatDay.we Day.susteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.moleft✝:Day.th Day.moright✝:steps = Day.mo.toNat - Day.th.toNatDay.th Day.mosteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.tuleft✝:Day.th Day.turight✝:steps = Day.tu.toNat - Day.th.toNatDay.th Day.tusteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.weleft✝:Day.th Day.weright✝:steps = Day.we.toNat - Day.th.toNatDay.th Day.westeps:Nateq:Std.PRange.succMany? steps Day.th = some Day.thleft✝:Day.th Day.thright✝:steps = Day.th.toNat - Day.th.toNatDay.th Day.thsteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.frleft✝:Day.th Day.frright✝:steps = Day.fr.toNat - Day.th.toNatDay.th Day.frsteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.saleft✝:Day.th Day.saright✝:steps = Day.sa.toNat - Day.th.toNatDay.th Day.sasteps:Nateq:Std.PRange.succMany? steps Day.th = some Day.suleft✝:Day.th Day.suright✝:steps = Day.su.toNat - Day.th.toNatDay.th Day.susteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.moleft✝:Day.fr Day.moright✝:steps = Day.mo.toNat - Day.fr.toNatDay.fr Day.mosteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.tuleft✝:Day.fr Day.turight✝:steps = Day.tu.toNat - Day.fr.toNatDay.fr Day.tusteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.weleft✝:Day.fr Day.weright✝:steps = Day.we.toNat - Day.fr.toNatDay.fr Day.westeps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.thleft✝:Day.fr Day.thright✝:steps = Day.th.toNat - Day.fr.toNatDay.fr Day.thsteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.frleft✝:Day.fr Day.frright✝:steps = Day.fr.toNat - Day.fr.toNatDay.fr Day.frsteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.saleft✝:Day.fr Day.saright✝:steps = Day.sa.toNat - Day.fr.toNatDay.fr Day.sasteps:Nateq:Std.PRange.succMany? steps Day.fr = some Day.suleft✝:Day.fr Day.suright✝:steps = Day.su.toNat - Day.fr.toNatDay.fr Day.susteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.moleft✝:Day.sa Day.moright✝:steps = Day.mo.toNat - Day.sa.toNatDay.sa Day.mosteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.tuleft✝:Day.sa Day.turight✝:steps = Day.tu.toNat - Day.sa.toNatDay.sa Day.tusteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.weleft✝:Day.sa Day.weright✝:steps = Day.we.toNat - Day.sa.toNatDay.sa Day.westeps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.thleft✝:Day.sa Day.thright✝:steps = Day.th.toNat - Day.sa.toNatDay.sa Day.thsteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.frleft✝:Day.sa Day.frright✝:steps = Day.fr.toNat - Day.sa.toNatDay.sa Day.frsteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.saleft✝:Day.sa Day.saright✝:steps = Day.sa.toNat - Day.sa.toNatDay.sa Day.sasteps:Nateq:Std.PRange.succMany? steps Day.sa = some Day.suleft✝:Day.sa Day.suright✝:steps = Day.su.toNat - Day.sa.toNatDay.sa Day.susteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.moleft✝:Day.su Day.moright✝:steps = Day.mo.toNat - Day.su.toNatDay.su Day.mosteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.tuleft✝:Day.su Day.turight✝:steps = Day.tu.toNat - Day.su.toNatDay.su Day.tusteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.weleft✝:Day.su Day.weright✝:steps = Day.we.toNat - Day.su.toNatDay.su Day.westeps:Nateq:Std.PRange.succMany? steps Day.su = some Day.thleft✝:Day.su Day.thright✝:steps = Day.th.toNat - Day.su.toNatDay.su Day.thsteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.frleft✝:Day.su Day.frright✝:steps = Day.fr.toNat - Day.su.toNatDay.su Day.frsteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.saleft✝:Day.su Day.saright✝:steps = Day.sa.toNat - Day.su.toNatDay.su Day.sasteps:Nateq:Std.PRange.succMany? steps Day.su = some Day.suleft✝:Day.su Day.suright✝:steps = Day.su.toNat - Day.su.toNatDay.su Day.su All goals completed! 🐙

现在可以迭代天数范围:

It's Day.mo It's Day.tu It's Day.we #eval show IO Unit from do for x in (Day.mo...Day.th).iter do IO.println s!"It's {repr x}"
It's Day.mo
It's Day.tu
It's Day.we

20.18.4. 范围和切片🔗

范围语法可与支持切片的数据结构一起使用以选择结构的切片。

Slicing Lists

列表可以使用任何间隔类型进行切片:

def groceries := ["apples", "bananas", "coffee", "dates", "endive", "fennel"] ["bananas", "coffee", "dates"]#eval groceries[1...4] |>.toList
["bananas", "coffee", "dates"]
["bananas", "coffee", "dates", "endive"]#eval groceries[1...=4] |>.toList
["bananas", "coffee", "dates", "endive"]
["bananas", "coffee", "dates", "endive", "fennel"]#eval groceries[1...*] |>.toList
["bananas", "coffee", "dates", "endive", "fennel"]
["coffee", "dates"]#eval groceries[1<...4] |>.toList
["coffee", "dates"]
["coffee", "dates", "endive"]#eval groceries[1<...=4] |>.toList
["coffee", "dates", "endive"]
["apples", "bananas", "coffee", "dates", "endive"]#eval groceries[*...=4] |>.toList
["apples", "bananas", "coffee", "dates", "endive"]
["apples", "bananas", "coffee", "dates"]#eval groceries[*...4] |>.toList
["apples", "bananas", "coffee", "dates"]
["apples", "bananas", "coffee", "dates", "endive", "fennel"]#eval groceries[*...*] |>.toList
["apples", "bananas", "coffee", "dates", "endive", "fennel"]
Custom Slices

Triple 包含三个相同类型的值:

structure Triple (α : Type u) where fst : α snd : α thd : α deriving Repr

三元组中的位置可以是任何字段,或者紧接在 thd 之后:

inductive TriplePos where | fst | snd | thd | done deriving Repr

三元组的切片由三元组、起始位置和停止位置组成。 包含起始位置,不包含停止位置:

structure TripleSlice (α : Type u) where triple : Triple α start : TriplePos stop : TriplePos deriving Repr

通过实现每个支持的范围类型的 Sliceable 类的实例,TriplePos 的范围可用于从三元组中选择一个切片。 例如,Std.Rco.Sliceable 允许使用左闭、右开范围对 Triple 进行切片:

instance : Std.Rco.Sliceable (Triple α) TriplePos (TripleSlice α) where mkSlice triple range := { triple, start := range.lower, stop := range.upper } def abc : Triple Char := 'a', 'b', 'c' open TriplePos in { triple := { fst := 'a', snd := 'b', thd := 'c' }, start := TriplePos.snd, stop := TriplePos.thd }#eval abc[snd...thd]
{ triple := { fst := 'a', snd := 'b', thd := 'c' }, start := TriplePos.snd, stop := TriplePos.thd }

无限范围只有一个下界:

instance : Std.Rci.Sliceable (Triple α) TriplePos (TripleSlice α) where mkSlice triple range := { triple, start := range.lower, stop := .done } open TriplePos in { triple := { fst := 'a', snd := 'b', thd := 'c' }, start := TriplePos.snd, stop := TriplePos.done }#eval abc[snd...*]
{ triple := { fst := 'a', snd := 'b', thd := 'c' }, start := TriplePos.snd, stop := TriplePos.done }
🔗type class
Std.Rco.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max (max u v) w)
Std.Rco.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max (max u v) w)

This typeclass indicates how to obtain slices of elements of α over ranges in the index type β, the ranges being left-closed right-open.

The type of the resulting slices is γ.

Instance Constructor

Std.Rco.Sliceable.mk.{u, v, w}

Methods

mkSlice : α  Std.Rco β  γ

Slices carrier from range.lower (inclusive) to range.upper (exclusive).

🔗type class
Std.Rcc.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max (max u v) w)
Std.Rcc.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max (max u v) w)

This typeclass indicates how to obtain slices of elements of α over ranges in the index type β, the ranges being closed.

The type of the resulting slices is γ.

Instance Constructor

Std.Rcc.Sliceable.mk.{u, v, w}

Methods

mkSlice : α  Std.Rcc β  γ

Slices carrier from range.lower to range.upper, both inclusive.

🔗type class
Std.Rci.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max (max u v) w)
Std.Rci.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max (max u v) w)

This typeclass indicates how to obtain slices of elements of α over ranges in the index type β, the ranges being left-closed right-unbounded.

The type of the resulting slices is γ.

Instance Constructor

Std.Rci.Sliceable.mk.{u, v, w}

Methods

mkSlice : α  Std.Rci β  γ

Slices carrier from range.lower (inclusive).

🔗type class
Std.Roo.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max (max u v) w)
Std.Roo.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max (max u v) w)

This typeclass indicates how to obtain slices of elements of α over ranges in the index type β, the ranges being open.

The type of the resulting slices is γ.

Instance Constructor

Std.Roo.Sliceable.mk.{u, v, w}

Methods

mkSlice : α  Std.Roo β  γ

Slices carrier from range.lower to range.upper, both exclusive.

🔗type class
Std.Roc.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max (max u v) w)
Std.Roc.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max (max u v) w)

This typeclass indicates how to obtain slices of elements of α over ranges in the index type β, the ranges being left-open right-closed.

The type of the resulting slices is γ.

Instance Constructor

Std.Roc.Sliceable.mk.{u, v, w}

Methods

mkSlice : α  Std.Roc β  γ

Slices carrier from range.lower (exclusive) to range.upper (inclusive).

🔗type class
Std.Roi.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max (max u v) w)
Std.Roi.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max (max u v) w)

This typeclass indicates how to obtain slices of elements of α over ranges in the index type β, the ranges being left-open right-unbounded.

The type of the resulting slices is γ.

Instance Constructor

Std.Roi.Sliceable.mk.{u, v, w}

Methods

mkSlice : α  Std.Roi β  γ

Slices carrier from range.lower (exclusive).

🔗type class
Std.Rio.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max (max u v) w)
Std.Rio.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max (max u v) w)

This typeclass indicates how to obtain slices of elements of α over ranges in the index type β, the ranges being left-unbounded right-open.

The type of the resulting slices is γ.

Instance Constructor

Std.Rio.Sliceable.mk.{u, v, w}

Methods

mkSlice : α  Std.Rio β  γ

Slices carrier up to range.upper (exclusive).

🔗type class
Std.Ric.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max (max u v) w)
Std.Ric.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max (max u v) w)

This typeclass indicates how to obtain slices of elements of α over ranges in the index type β, the ranges being left-unbounded right-closed.

The type of the resulting slices is γ.

Instance Constructor

Std.Ric.Sliceable.mk.{u, v, w}

Methods

mkSlice : α  Std.Ric β  γ

Slices carrier up to range.upper (inclusive).

🔗type class
Std.Rii.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max u w)
Std.Rii.Sliceable.{u, v, w} (α : Type u) (β : outParam (Type v)) (γ : outParam (Type w)) : Type (max u w)

This typeclass indicates how to obtain slices of elements of α over the full range in the index type β.

The type of the resulting slices is γ.

Instance Constructor

Std.Rii.Sliceable.mk.{u, v, w}

Methods

mkSlice : α  Std.Rii β  γ

Slices carrier with no bounds.