Я пытаюсь доказать, что на мой взгляд является разумной теоремой:Я не могу доказать (п - 0) = п с Идрисом
theorem1 : (n : Nat) -> (m : Nat) -> (n + (m - n)) = m
Доказательства индукции попадет в точку, где мне нужно доказать это:
lemma1 : (n : Nat) -> (n - 0) = n
Это то, что происходит, когда я пытаюсь это доказать (лемму, для простоты), используя интерактивную прувер:
---------- Goal: ----------
{hole0} : (n : Nat) -> minus n 0 = n
> intros
---------- Other goals: ----------
{hole0}
---------- Assumptions: ----------
n : Nat
---------- Goal: ----------
{hole1} : minus n 0 = n
> trivial
Can't unify
n = n
with
minus n 0 = n
Specifically:
Can't unify
n
with
minus n 0
Я чувствовал, что я должен быть что-то отсутствует об определении минус, так что я посмотрел его в источнике:
||| Subtract natural numbers. If the second number is larger than the first, return 0.
total minus : Nat -> Nat -> Nat
minus Z right = Z
minus left Z = left
minus (S left) (S right) = minus left right
определение мне нужно прямо здесь! minus left Z = left
. Я понял, что Идрис должен просто заменить minus m 0
на m
здесь, и тогда это будет рефлексивно верно. Что я пропустил?
Idris - это язык, набираемый на основе правил, который делает доказательства и программы синонимичными из-за изоморфизма Карри-Говарда. Мне нужно доказать эту теорему в коде, чтобы моя функция была хорошо набрана (я оставил функцию, потому что объяснение этого заняло бы лишнее пространство). По этой причине Идрис приходит с интерактивным инструментом. Поэтому вопрос заключается в том, как использовать язык программирования Идрис, а не о самой математике. –
Извините, если это очевидно, не знакомы с языком, но просматривая некоторые примеры для этого языка - это далеко не ясно. «0» и «Z» всегда рассматриваются как синонимы или есть что-то требуемое там, чтобы заставить его работать? –
Числовые литералы полиморфно перегружены, как в Haskell. 'Nat' является членом класса' Num', одна из которых - 'fromInteger'. И 'fromInteger 0 = Z'. (Существует также специальный корпус для Nat, который продолжается на самом языке и в терминале, я думаю.) Короче говоря, я не думаю, что это проблема, хотя я недостаточно уверен, чтобы быть полностью уверенным. –