Как я могу доказать, что две вещи не равны в Кубической Агде? (v2.6.1, версия кубического репо acabbd9
)
Конкретно, вот целые числа более высокого индуктивного типа:
{-# OPTIONS --safe --warning=error --cubical --without-K #-}
open import Cubical.Core.Everything
open import Cubical.Foundations.Prelude
module Integers where
data False : Set where
data ℕ : Set where
zero : ℕ
succ : ℕ → ℕ
{-# BUILTIN NATURAL ℕ #-}
data ℤ : Set where
pos : ℕ → ℤ
neg : ℕ → ℤ
congZero : pos 0 ≡ neg 0
Легко показать некоторые довольно странные равенства, потому что " «равенство» здесь на самом деле означает нечто, что не совсем то, к чему мы привыкли в некубическом мире:
oddThing2 : pos 0 ≡ congZero i1
oddThing2 = congZero
Я нашел довольно неприятное доказательство того, что преемники отличны от нуля в https://github.com/Saizan/cubical-demo/blob/b112c292ded61b02fa32a1b65cac77314a1e9698/examples/Cubical/Examples/CTT/Data/Nat.agda:
succNonzero : {a : ℕ} → succ a ≡ 0 → False
succNonzero {a} s = subst t s 0
where
t : ℕ → Set
t zero = False
t (succ i) = ℕ
Есть ли более приятное доказательство? Я не могу больше сопоставлять образцы с доказательством succ a ≡ 0
; в не кубической Агде доказательство будет просто oneNotZero ()
, идентифицирующее невозможный образец.
Тогда как я могу доказать следующее (это даже верно?)
posInjective : {a b : ℤ} → pos a ≡ pos b → a ≡ b
Это, вероятно, ясно, что я новичок в Cubical; но я использовал Агду нетривиальное количество в прошлом.