Итак, я написал следующий тип, чтобы доказать некоторые свойства целых чисел:
data Number : Type where
PosN : Nat -> Number
Zero : Number
NegN : Nat -> Number
plusPosNeg : Nat -> Nat -> Number
plusPosNeg n m with (cmp n m)
plusPosNeg (k + S d) k | CmpGT d = PosN d
plusPosNeg k k | CmpEQ = Zero
plusPosNeg k (k + S d) | CmpLT d = NegN d
plus : Number -> Number -> Number
plus Zero y = y
plus x Zero = x
plus (PosN k) (PosN j) = PosN (k + j)
plus (NegN k) (NegN j) = NegN (k + j)
plus (PosN k) (NegN j) = plusPosNeg k j
plus (NegN k) (PosN j) = plusPosNeg j k
Теперь я хотел бы доказать, что Zero
является нейтральным элементом сложения, что вполне очевидно изопределение plus
.И действительно, Идрис принимает следующее доказательство:
plusRZeroNeutral : {l : Number} -> plus l Zero = l
plusRZeroNeutral {l = Zero} = Refl
plusRZeroNeutral {l = PosN _} = Refl
plusRZeroNeutral {l = NegN _} = Refl
Но отвергает более короткую версию, которую я впервые придумала:
plusRZeroNeutral : {l : Number} -> plus l Zero = l
plusRZeroNeutral {l} = Refl
Мой вопрос: почему это так?Глядя на определение plus
, может показаться, что компилятор должен знать, что конструктор, переданный в качестве правого аргумента plus
, не имеет значения, если левый аргумент равен Zero
(и наоборот).Возможно, это ошибка, или я что-то упустил?