【问题标题】:How to prove a relation at compile-time in Lean?如何在精益编译时证明关系?
【发布时间】:2017-07-08 17:30:43
【问题描述】:

假设我有一个类型:

inductive is_sorted {α: Type} [decidable_linear_order α] : list α -> Prop
| is_sorted_zero : is_sorted []
| is_sorted_one : Π (x: α), is_sorted [x]
| is_sorted_many : Π {x y: α} {ys: list α}, x < y -> is_sorted (y::ys) -> is_sorted (x::y::ys)

而且它是可判定的:

instance decidable_sorted {α: Type} [decidable_linear_order α] : ∀ (l : list α), decidable (is_sorted l)

如果我有一个特定的列表:

def l1: list ℕ := [2,3,4,5,16,66]

是否可以证明它是在“编译时”排序的;在顶层生成is_sorted l1

我试过def l1_sorted: is_sorted l1 := if H: is_sorted l1 then H else sorry,但我不知道如何证明后一种情况是不可能的。我也尝试过simp 策略,但似乎没有帮助。

我可以用#reduce 证明这一点,但无法将其输出分配给变量。

【问题讨论】:

    标签: dependent-type type-theory lean


    【解决方案1】:

    您应该能够使用dec_trivial 来证明l1_sorted。这将尝试推断decidable (is_sorted l1) 的实例,如果实例评估为is_true p,它将减少到p

    【讨论】:

    • 我将如何编写它? lemma l1_sorted: is_sorted l1 := by dec_trivial 不起作用,by dec_trivial (is_sorted l1) 也不起作用。
    • lemma l1_sorted: is_sorted l1 := dec_trivial
    • 这似乎失败了:infer type failed, unknown variable _inst_1 of_as_true : ∀ {c : Prop} [h₁ : decidable c], as_true c → c
    • 实际上,我的问题是我有instance decidable_sorted 而不是instance decidable_is_sorted,我没有意识到查找是基于名称的,抱歉。
    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多