我正在尝试通过查看一些练习Software Foundations来改善我的Idris技能(最初是为了Coq,但我希望对Idris的翻译不会太糟糕)。我在使用"Exercise: 1 star (plus_id_exercise)"时遇到问题:
删除"已录取。"并填写证明。
Theorem plus_id_exercise : ∀ n m o : nat, n = m → m = o → n + m = m + o. Proof. (* FILL IN HERE *) Admitted.
我在Idris中翻译成以下问题:
plusIdExercise : (n : Nat) ->
(m : Nat) ->
(o : Nat) ->
(n == m) = True ->
(m == o) = True ->
(n + m == m + o) = True
我正在尝试逐个案例分析,我遇到了很多问题。第一种情况:
plusIdExercise Z Z Z n_eq_m n_eq_o = Refl
似乎有用,但后来我想说:
plusIdExercise (S n) Z Z n_eq_m n_eq_o = absurd
但这不起作用并给出:
When checking right hand side of plusIdExercise with expected type
S n + 0 == 0 + 0 = True
Type mismatch between
t -> a (Type of absurd)
and
False = True (Expected type)
Specifically:
Type mismatch between
\uv => t -> uv
and
(=) FalseUnification failure
我试图说这种情况永远不会发生,因为n == m,但Z(= m)永远不是任何数字(n)的后继者。有什么办法可以解决这个问题吗?我接近这个吗?我有点困惑。
答案 0 :(得分:5)
我认为翻译并不完全正确。 Coq中描述的引理不对自然数使用布尔相等,它使用所谓的命题相等。在Coq中,您可以要求系统为您提供有关事物的更多信息:
Coq < About "=".
eq : forall A : Type, A -> A -> Prop
上述方法=
(它是eq
类型的语法糖)采用某种类型A
的两个参数并生成命题,而不是布尔值值。
这意味着直接翻译将是以下代码段
plusIdExercise : (n = m) -> (m = o) -> (n + m = m + o)
plusIdExercise Refl Refl = Refl
当您对相等类型的值进行模式匹配时,Idris基本上会根据相应的等式重写术语(它大致相当于Coq的rewrite
策略)。
顺便说一句,您可能会发现Software Foundations in Idris项目很有用。