【发布时间】:2017-07-10 12:00:25
【问题描述】:
我对 Agda 很陌生。我正在处理作业中的一个问题。我已经完成了大部分任务,但我一直坚持一个目标。
data Arith : Set where
Num : ℕ → Arith
Plus : Arith → Arith → Arith
Times : Arith → Arith → Arith
eval : Arith → ℕ
eval (Num x) = x
eval (Plus e1 e2) = eval e1 + eval e2
eval (Times e1 e2) = eval e1 * eval e2
data Even : ℕ → Set where
zEven : Even 0
ssEven : {n : ℕ} → Even n → Even (suc (suc n))
-- [PROBLEM 1]
plusEven : ∀ n m → Even n → Even m → Even (n + m)
plusEven zero m x x₁ = x₁
plusEven (suc zero) m () x₁
plusEven (suc (suc .0)) m (ssEven zEven) x₁ = ssEven x₁
plusEven (suc (suc ._)) m (ssEven (ssEven x)) x₁ = ssEven (ssEven (plusEven _ m x x₁ ))
-- [PROBLEM 2]
timesEven : ∀ n m → Even n → Even m → Even (n * m)
timesEven zero m x x₁ = zEven
timesEven (suc ._) zero (ssEven x) x₁ = (timesEven _ zero x x₁)
timesEven (suc ._) (suc ._) (ssEven x) (ssEven x₁) = ssEven ((λ h → {!!}) (timesEven _ _ x x₁))
我要证明的目标是
Goal: Even (.n₁ + suc (suc (.n₁ + .n * suc (suc .n₁))))
我觉得我必须使用plusEven some how。但目标看起来并不那么简单。我让问题变得困难了吗?还是我在正确的轨道上?有没有更简单的方法来做到这一点?我不想解决这个问题。但是,我们将不胜感激朝着正确的方向前进。我已经坚持了一段时间了。
【问题讨论】:
标签: functional-programming agda