Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
val indN_naddSm_eq_S_naddm = NatInd.induc(n :-> (m ~>: ( add(n)(succ(m)) =:= succ(add(n)(m)) )))
val hyp1 = "n+Sm=S(n+m)" :: (m ~>: ( add(n)(succ(m)) =:= succ(add(n)(m)) ))
val lemma = indN_naddSm_eq_S_naddm(m :~> succ(m).refl)(n :~> (hyp1 :-> (m :~>
IdentityTyp.extnslty(succ)( add(n)(succ(m)) )( succ(add(n)(m)) )( hyp1(m) )
))) !: n ~>: m ~>: ( add(n)(succ(m)) =:= succ(add(n)(m)) )
val lemma1 = IdentityTyp.extnslty(succ)( add(n)(succ(n)) )( succ(add(n)(n)) )( lemma(n)(n) )
val indN_naddn_eq_2n = NatInd.induc(n :-> ( add(n)(n) =:= double(n) ))
val hyp = "n+n=2*n" :: ( add(n)(n) =:= double(n) )
val lemma2 = IdentityTyp.extnslty( m :-> succ(succ(m)) )( add(n)(n) )( double(n) )(hyp)
indN_naddn_eq_2n(zero.refl)(n :~> (hyp :->
IdentityTyp.trans(Nat)( add(succ(n))(succ(n)) )( succ(succ(add(n)(n))) )( double(succ(n)) )(lemma1)(lemma2)
)) !: n ~>: ( add(n)(n) =:= double(n) )
Если доказательство n+n = 2*n — это жесть, то что же тогда доказательство реально сложных выкладок?
Глобальная цель библиотеки — брать статью живого математика, парсить текст, переводить естественный язык с формулами в формальные доказательства, которые мог бы чекать компилятор.то по идее в ProvingGround должны быть какие-то очень мощные эвристики. Человек в статье пишет какое-нибудь равенство и затем пишет «это может быть легко доказано по индукции». А ProvingGround автоматически это доказывает и человеку не нужно писать эту жесть?
HoTT allows mathematical proofs to be translated into a computer programming language for computer proof assistants much more easily than before. This approach offers the potential for computers to check difficult proofs.Было бы очень интересно увидеть пример упрощения…
Я даже не могу понять где тут доказательство для базы, где для шага индукции.
n ~>: m ~>: ( add(n)(succ(m)) =:= succ(add(n)(m)) )
второе — n ~>: ( add(n)(n) =:= double(n) )
m :~> succ(m).refl
шаг — n :~> (hyp1 :-> (m :~>
IdentityTyp.extnslty(succ) ...
т.е. аргументы, к которым применена индукция indN_naddSm_eq_S_naddm.zero.refl
шаг — n :~> (hyp :->
IdentityTyp.trans(Nat) ...
т.е. аргументы, к которым применена индукция indN_naddn_eq_2n.… то по идее в ProvingGround должны быть какие-то очень мощные эвристики.
И ещё HoTT как-то упрощает формулировку и доказательство теорем по сравнению с другими подходами?
Тот же Isabelle/HOL выглядит гораздо понятнее.
same_cons : {xs : List a} -> {ys : List a} -> xs = ys -> x :: xs = x :: ys
same_cons Refl = Refl
В ProvingGround — какval as = "as" :: ListA
val as1 = "as1" :: ListA
val as2 = "as2" :: ListA
val pf = "as=as1" :: ( as =:= as1 )
a :~> (as :~> (as1 :~> (pf :-> IdentityTyp.extnslty(as2 :-> cons(a)(as2))(as)(as1)(pf)
))) !: a ~>: as ~>: as1 ~>: (( as =:= as1 ) ->: ( cons(a)(as) =:= cons(a)(as1) ))
которое можно записать короче:val as = "as" :: ListA
val as1 = "as1" :: ListA
a :~> (as :~> (as1 :~> IdentityTyp.extnslty(cons(a))(as)(as1)
)) !: a ~>: as ~>: as1 ~>: (( as =:= as1 ) ->: ( cons(a)(as) =:= cons(a)(as1) ))
plus_n_zero : (n : Nat) -> n + 0 = n
plus_n_zero Z = Refl
plus_n_zero (S n) = rewrite plus_n_zero n
in Refl
В ProvingGround — val indN_nadd0_eq_n = NatInd.induc(n :-> ( add(n)(zero) =:= n ))
val hyp = "n+0=n" :: ( add(n)(zero) =:= n )
indN_nadd0_eq_n(zero.refl)(n :~> (hyp :-> IdentityTyp.extnslty(succ)( add(n)(zero) )(n)(hyp)
)) !: n ~>: ( add(n)(zero) =:= n )
или корочеval indN_nadd0_eq_n = NatInd.induc(n :-> ( add(n)(zero) =:= n ))
indN_nadd0_eq_n(zero.refl)(n :~> IdentityTyp.extnslty(succ)( add(n)(zero) )(n)
) !: n ~>: ( add(n)(zero) =:= n )
Refl равна Refl, за rewrite'ами и т.д.HoTT расширяет класс теорем (упрощает работу с ними). То есть не только теоремы типа (n+m)+k=n+(m+k), n+n=2*n, но и типа π1(S1)=Z, π2(S2)=Z, π2(S2)=Z.Тут пишут, что π1(S1) — это совокупность отображений окружностей в окружности. Например, одна окружность — это охват руки, вторая окружность — это резинка. Резинку можно просто одеть на запястье, можно обернуть 2 раза вокруг запястья, 3, 4,… и т.д. Короче, множество таких отображений изоморфно множеству целых чисел Z. Не понимаю, как это может использоваться в программировании или доказательстве теорем…
Не понимаю, как это может использоваться в программировании или доказательстве теорем…
Начал слушать курс лекций...
От зависимых типов к гомотопической теории типов на Scala + Shapeless + ProvingGround