Каждая цель, с которой я столкнулся в Isabelle до сих пор, которую можно было решить с помощью arith
, также можно было решить с помощью presburger
и наоборот, например.
lemma "odd (n::nat) ⟹ Suc (2 * (n div 2)) = n"
by presburger (* or arith *)
В чем разница между двумя решателями? Было бы неплохо привести примеры целей, которые может решить один, но не может решить другой.
Редактировать: мне удалось придумать лемму, доказанную arith
, с которой presburger
не может справиться. Похоже, это как-то связано с реальными числами:
lemma "max i (i + 1) > (i::nat)" by arith -- ✔
lemma "max i (i + 1) > (i::nat)" by presburger -- ✔
lemma "max i (i + 1) > (i::real)" by arith -- ✔
lemma "max i (i + 1) > (i::real)" by presburger -- ✘
presburger
не может работать с реальной арифметикой, аarith
может. Я думаю, чтоpresburger
— это просто реализация хорошо известной процедуры принятия решений для арифметики Пресбургера, аarith
— это набор различных процедур принятия решений для арифметики. Также естьlinarith
; Я не знаю, как это вписывается. - person Manuel Eberl   schedule 21.02.2015linarith
раньше (есть ли где-нибудь исчерпывающий список методов Isabelle/HOL?) - person curiousleo   schedule 22.02.2015lemma "(2 * i) div 2 = (i::real)" by presburger
(что работает для меня) не является контрпримером кpresburger
, который не может справиться с реальной арифметикой? - person curiousleo   schedule 22.02.2015real (2 * i div 2) = real i
, которое легко сокращается до2 * i div 2 = i
. Причина, по которой Изабель вставляет эти приведения, заключается в том, чтоdiv
не определено для вещественных чисел, поэтому Изабель по умолчанию используетint
и вставляет приведения, чтобы типы работали. - person Manuel Eberl   schedule 23.02.2015