Это продолжение до этого вопроса .Благодаря Кварцу у меня теперь есть состояние предложения, если b делит a, то b делит a * c для любого целого числа c, а именно:
alsoDividesMultiples : (a, b, c : Integer) ->
DivisibleBy a b ->
DivisibleBy (a * c) b
Теперь цель состояла в том, чтобы доказать это утверждение.Я понял, что не понимаю, как действовать на зависимых парах.Я попробовал более простую задачу, которая показала, что каждое число делится на 1. После постыдного количества размышлений об этом, Я думал Я нашел решение:
-- All numbers are divisible by 1.
DivisibleBy a 1 = let n = a in
(n : Integer ** a = 1 * n)
Это компилируется, но у меня были сомнения, что это действительно.Чтобы убедиться, что я был неправ, он немного изменил его на:
-- All numbers are divisible by 1.
DivisibleBy a 1 = let n = a in
(n : Integer ** a = 2 * n)
Это также компилирует, что означает, что моя «английская» интерпретация, безусловно, неверна, поскольку я бы интерпретировал это как «Все числа делятся на однопоскольку каждое число в два раза больше другого целого числа ".Таким образом, я не совсем уверен, что я демонстрирую этим заявлением.Итак, я вернулся и попробовал более традиционный способ постановки проблемы:
oneDividesAll : (a : Integer) ->
(DivisibleBy a 1)
oneDividesAll a = ?sorry
Для реализации oneDividesAll
Я не совсем уверен, как «внедрить» тот факт, что (n = a)
.Например, я бы написал (на английском языке) это доказательство как:
Мы хотим показать, что 1 |а.Если это так, из этого следует, что a = 1 * n
для некоторого n.Пусть n = a
, затем a = a * 1
, что верно для идентичности.
Я не уверен, как на самом деле сказать: «Подумайте, когда n = a
».Насколько я понимаю, тактика rewrite
требует доказательства того, что n = a
.
Я попытался адаптировать свое ошибочное доказательство:
oneDividesAll : (a : Integer) ->
(DivisibleBy a 1)
oneDividesAll a = let n = a in (n : Integer ** a = b * n)
Но это дает:
|
12 | oneDividesAll a = let n = a in (n : Integer ** a = b * n)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When checking right hand side of oneDividesAll with expected type
DivisibleBy a 1
Type mismatch between
Type (Type of DPair a P)
and
(n : Integer ** a = prim__mulBigInt 1 n) (Expected type)
Любая помощь / подсказки будут оценены.