Напишите математическое утверждение, используя символы:
There exists at least one non-negative integer
(записывается какE
экзистенциальный квантификатор)All non-negative integers
(записывается какA
универсальный квантификатор)+
(Дополнение)*
(Умножение)=
(Равенство)>
,<
(операторы сравнения)&
(и),|
(или),!
(не)(
,)
(для группировки)- имена переменных
что эквивалентно утверждению
Существует рациональное число a, такое, что π + e * a рационально.
(конечно, является математической константой, равной окружности, деленной на диаметр круга, а является числом Эйлера )
Вы должны доказать, что ваше утверждение действительно эквивалентно приведенному выше.
Очевидно, что «самый короткий» способ сделать это - доказать утверждение, истинное или ложное, и затем ответить тривиально истинным или ложным утверждением, поскольку все истинные утверждения эквивалентны друг другу, как и все ложные утверждения.
Однако значение истинности данного утверждения является нерешенной проблемой в математике : мы даже не знаем, является ли иррациональным! Поэтому, за исключением инновационных математических исследований, задача состоит в том, чтобы найти «простое» эквивалентное утверждение, доказать его эквивалентность и описать его как можно более кратко.
счет
E
A
+
*
=
>
<
&
|
и !
каждый добавляет 1 к баллу. (
и )
ничего не добавляйте к счету. Каждое имя переменной добавляет 1 к баллу.
Например, E x (A ba x+ba>x*(x+ba))
оценка 13 ( E
x
A
ba
x
+
ba
>
x
*
x
+
ba
)
Самый низкий балл побеждает.
Замечания:
Отказ от ответственности: это примечание не было написано ФП.
- Это не код-гольф вызов. Ответы не обязательно должны содержать код.
- Это похоже, но не на пробную игру в гольф , так как вам нужно написать утверждение и доказать, что оно эквивалентно другому утверждению.
- Вам разрешено представить тривиально-истинное (например, для всех x, x = x
Ax x=x
) или тривиально-ложное утверждение (например, для всех x, x> xAx x>x
), если вы можете доказать, что приведенное выше утверждение является истинным / ложным. - Вам разрешено использовать дополнительные символы (аналогично лемме в пробном гольфе), но счет будет засчитан так же, как вы их не используете.
Например, если вы укажетеa => b
значение(!a) | b
, каждый раз, когда вы используете=>
доказательство, ваш счет увеличивается на 2. Поскольку константы не указаны в разрешенных символах, вы не должны их использовать.
Например: утверждение1 > 0
может быть записано какForall zero: ( zero + zero = zero ) => Forall one: ( Forall x: x * one = x ) => one > zero
на счет 23. (помните, что
=>
стоит 2 за использование).
Советы
- Вы можете использовать натуральные константы
E0, 0+0=0 & E1, At 1*t=t &
(так что вам не нужно,=>
что более обширно); для чисел больше 1, просто добавьте 1
You are allowed to submit a trivially-true (e.g., for all x, x = x Ax x=x) or a trivially-false statement (e.g., for all x, x > x Ax x>x) if you can prove the statement above is true/false.
. В заявлении не теперь ни доказано , ни опровергнуто, так что я действительно не возражаю , если проблема становится скучно , потому что такая проблема решаетсяI'd be impressed by any solution no matter the score.
Счет был только для того, чтобы нацелиться на тех, кто может решить эту проблемуОтветы:
671
E a (a+a>a*a & (E b (E c (E d (A e (A f (f<a | (E g (E h (E i ((A j ((!(j=(f+f+h)*(f+f+h)+h | j=(f+f+a+i)*(f+f+a+i)+i) | j+a<e & (E k ((A l (!(l>a & (E m k=l*m)) | (E m l=e*m))) & (E l (E m (m<k & g=(e*l+(j+a))*k+m)))))) & (A k (!(E l (l=(j+k)*(j+k)+k+a & l<e & (E m ((A n (!(n>a & (E o m=n*o)) | (E o n=e*o))) & (E n (E o (o<m & g=(e*n+l)*m+o))))))) | j<a+a & k=a | (E l (E m ((E n (n=(l+m)*(l+m)+m+a & n<e & (E o ((A p (!(p>a & (E q o=p*q)) | (E q p=e*q))) & (E p (E q (q<o & g=(e*p+n)*o+q))))))) & j=l+a+a & k=j*j*m))))))) & (E j (E k (E l ((E m (m=(k+l)*(k+l)+l & (E n (n=(f+m)*(f+m)+m+a & n<e & (E o ((A p (!(p>a & (E q o=p*q)) | (E q p=e*q))) & (E p (E q (q<o & j=(e*p+n)*o+q))))))))) & (A m (A n (A o (!(E p (p=(n+o)*(n+o)+o & (E q (q=(m+p)*(m+p)+p+a & q<e & (E r ((A s (!(s>a & (E t r=s*t)) | (E t s=e*t))) & (E s (E t (t<r & j=(e*s+q)*r+t))))))))) | m<a & n=a & o=f | (E p (E q (E r (!(E s (s=(q+r)*(q+r)+r & (E t (t=(p+s)*(p+s)+s+a & t<e & (E u ((A v (!(v>a & (E w u=v*w)) | (E w v=e*w))) & (E v (E w (w<u & j=(e*v+t)*u+w))))))))) | m=p+a & n=(f+a)*q & o=f*r)))))))) & (E m (m=b*(h*f)*l & (E n (n=b*(h*f+h)*l & (E o (o=c*(k*f)*i & (E p (p=c*(k*f+k)*i & (E q (q=d*i*l & (m+o<q & n+p>q | m<p+q & n>o+q | o<n+q & p>m+q))))))))))))))))))))))))))
Как это устроено
Во-первых, умножьте на предполагаемые общие знаменатели a и (π + e · a), чтобы переписать условие следующим образом: существуют a, b, c ∈ ℕ (не все нули) с a · π + b · e = c или a · π - b · e = c или −a · π + b · e = c. Три случая необходимы для решения проблем со знаком.
Затем нам нужно переписать это, чтобы говорить о π и e через рациональные приближения: для всех рациональных приближений π₀ <π <π₁ и e₀ <e <e₁, мы имеем · π₀ + b · e₀ <c <a · π₁ + b · e₁ или a · π₀ - b · e₁ <c <a · π₁ + b · e₀ или −a · π₁ + b · e₀ <c <−a · π₀ + b · e₁. (Обратите внимание, что теперь мы получаем условие «не все ноль» бесплатно.)
Теперь о трудной части. Как мы получаем эти рациональные приближения? Мы хотим использовать формулы как
2/1 · 2/3 · 4/3 · 4/5 ⋯ (2 · k) / (2 · k + 1) <π / 2 <2/1 · 2/3 · 4/3 · 4/5 ⋯ (2 · k) / (2 · k + 1) · (2 · k + 2) / (2 · k + 1),
((k + 1) / k) k <e <((k + 1) / k) k + 1 ,
но нет очевидного способа написать итерационные определения этих продуктов. Итак, мы создаем немного механизма, который я впервые описал в этом посте Quora . Определение:
делит (d, a): = ∃b, a = d · b,
powerOfPrime (a, p): = ∀b, ((b> 1 и делит (b, a)) ⇒ делит (p, b)),
который выполняется тогда и только тогда, когда a = 1, или p = 1, или p простое и a является степенью его. потом
isDigit (a, s, p): = a <p и ∃b, (powerOfPrime (b, p) и ∃qr, (r <b и s = (p · q + a) · b + r))
выполняется тогда и только тогда, когда a = 0, или a является цифрой от числа base-p s. Это позволяет нам представлять любой конечный набор, используя цифры некоторого числа base-p. Теперь мы можем перевести итеративные вычисления, написав, примерно, что существует набор промежуточных состояний, таких, что конечное состояние находится в наборе, и каждое состояние в наборе является либо начальным состоянием, либо в одном шаге следует из некоторого другого состояния в устанавливать.
Подробности в коде ниже.
Генерация кода в Haskell
Попробуйте онлайн!
источник
isDigit
, единственное место, где вы его используете.powerOfPrime
и вisDigit
конечном итоге представляют в неожиданных случаях, если есть какой-то способ представить каждый конечный набор.)a
Думаю, если у него 7 или выше, то стоит добавитьex (\a' -> a' := a :& ... )
оберткуisDigit
.k>0
, так какeBound
дает нулевой знаменатель (и один нулевой числитель) в этомk==0
случае, поэтому все альтернативы терпят неудачу.270
a|b&c
Этоa|(b&c)
потому, что я думаю, что удаление этих скобок делает его лучше, в любом случае, они бесплатны.Использовал JavaScript
"(expr)".replace(/\{.*?\}/g,'').match(/[a-z0-9]+|[^a-z0-9\s\(\)]/g)
для подсчета токенов.источник
mult = t
? Кроме того, так какx
может иметь только конечное число цифр, вам нужно учитыватьe1 = e2 = 0
достаточно большойt
. Также вам понадобится больше скобок или другой неоднозначности для неоднозначных конструкций, таких как_ & _ | _
.mult
. Не вижу проблемmult=t2
в конце.e1=e2=0
должно быть исправлено, но не так точно, поэтому в настоящее время я не изменяю принятие.a & b | c
это(a & b) | c
то, что выt*1=t
, безусловно, не в том месте. Также вы не исключили тривиальное решениеc1 = c4 & c2 = c5 & c3 = 0 & diff = diff2
.diff≠diff2
работать?!(c2=c5)
как мы уже знаемe
, иррационально, поэтому, даже если это не сработает, счет не увеличится