Напишіть програму, непереривання якої не залежить від арифметики Пеано


29

Виклик

Напишіть програму P, не вводячи ніяких даних, щоб пропозиція "виконання P врешті-решт припиняється" не залежить від арифметики Пеано .

Формальні правила

(Якщо ви математичний логік, який вважає, що описаний вище опис є надто неофіційним.)

В принципі, можна перетворити деяку універсальну машину Тюрінга U (наприклад, вашу улюблену мову програмування) в арифметичну формулу Peano HALT через змінну p , де HALT ( p ) кодує пропозицію " U закінчується програмою ( кодується Gödel ) р ”. Завдання полягає в тому, щоб знайти p таким, що не може бути доведено ані HALT ( p ), а ¬HALT ( p ) в арифметиці Peano.

Ви можете припустити, що ваша програма працює на ідеальній машині з необмеженою пам’яттю та цілими числами / покажчиками, достатньо великими для доступу до неї.

Приклад

Щоб побачити, що такі програми існують, один приклад - програма, яка вичерпно шукає арифметичний доказ Peano 0 = 1. Арифметика Peano доводить, що ця програма зупиняється тоді і лише тоді, коли арифметика Peano суперечить. Оскільки арифметика Peano є послідовною, але не може довести свою послідовність , вона не може вирішити, чи припиняється ця програма.

Однак існує багато інших пропозицій, незалежних від арифметики Peano, на яких ви можете базувати свою програму.

Мотивація

Цей виклик був надихнутий новим документом Yedidia та Aaronson (2016), який демонстрував машину Тьюрінга в штаті 7 918 держав, невстановлення якої не залежить від ZFC , набагато сильнішої системи, ніж арифметика Peano. Вас може зацікавити його цитування [22]. Для цього виклику, звичайно, ви можете використовувати обрану мову програмування замість фактичних машин Тьюрінга.


6
Які системи аксіом можуть бути використані для доведення того, що: (а) програма не припиняється; і (б) неприпинення програми не є доцільним у ПА?
feersum

5
Я не думаю, що вимагати, щоб це запитання містило всю необхідну основу математичної логіки. Це зовсім небагато, і є посилання на відповідну інформацію. Це не заплутано, це лише технічна тема. Я думаю, що це допомогло б забезпечити доступність заявити вимогу коду окремо від мотивації, що стосується машин Тьюрінга, і прив’язати до якогось прикладу незалежних від Peano тверджень, зокрема , Теореми Гудстейна ( спорідненого гольфу )
xnor

Щоб це мало сенс, нам потрібно припустити, що код працює на ідеалізованій машині з необмеженою пам'яттю. Чи можна також припустити, що машина має довільну реальну точність?
xnor

1
@feersum Я не чекаю аксіоматичного доказування (a) та (b). Просто напишіть програму та надайте достатньо опису / аргументів / цитат, щоб бути переконливо переконливим, що твердження є правдивими, як і у будь-якого іншого виклику. Ви можете покластися на будь-які стандартно прийняті аксіоми та теореми, які вам потрібні.
Андерс Касеорг

2
@xnor Ви можете приймати необмежену пам’ять та необмежені вказівники, з якими отримувати доступ до неї. Але я не думаю, що розумно вважати довільну реальну точність, якщо ваша мова насправді не забезпечує цього; на більшості мов така програма x = 1.0; while (x) { x = x / 2.0; }насправді зупиняється дуже швидко.
Андерс Касеорг

Відповіді:


27

Haskell, 838 байт

"Якщо ви хочете щось зробити, ..."

import Control.Monad.State
data T=V Int|T:$T|A(T->T)
g=guard
r=runStateT
s!a@(V i)=maybe a id$lookup i s
s!(a:$b)=(s!a):$(s!b)
s@((i,_):_)!A f=A(\a->((i+1,a):s)!f(V$i+1))
c l=do(m,k)<-(`divMod`sum(1<$l)).pred<$>get;g$m>=0;put m;l!!fromEnum k
i&a=V i:$a
i%t=(:$).(i&)<$>t<*>t
x i=c$[4%x i,5%x i,(6&)<$>x i]++map(pure.V)[7..i-1]
y i=c[A<$>z i,1%y i,(2&)<$>y i,3%x i]
z i=(\a e->[(i,e)]!a)<$>y(i+1)
(i?h)p=c[g$any(p#i)h,do q<-y i;i?h$q;i?h$1&q:$p,do f<-z i;a<-x i;g$p#i$f a;c[i?h$A f,do b<-x i;i?h$3&b:$a;i?h$f b],case p of A f->c[(i+1)?h$f$V i,do i?h$f$V 7;(i+1)?(f(V i):h)$f$6&V i];V 1:$q:$r->c[i?(q:h)$r,i?(2&r:h)$V 2:$q];_->mzero]
(V a#i)(V b)=a==b
((a:$b)#i)(c:$d)=(a#i)c&&(b#i)d
(A f#i)(A g)=f(V i)#(i+1)$g$V i
(_#_)_=0<0
main=print$(r(8?map fst(r(y 8)=<<[497,8269,56106533,12033,123263749,10049,661072709])$3&V 7:$(6&V 7))=<<[0..])!!0

Пояснення

Ця програма безпосередньо шукає арифметичний доказ Peano 0 = 1. Оскільки ПА є послідовним, ця програма ніколи не припиняється; але оскільки ПА не може довести свою послідовність, не припинення цієї програми не залежить від ПТ.

T - це тип виразів і пропозицій:

  • A Pявляє собою пропозицію ∀ x [ P ( x )].
  • (V 1 :$ P) :$ Qє пропозиція РQ .
  • V 2 :$ Pподає пропозиції ¬ P .
  • (V 3 :$ x) :$ yявляє собою пропозицію x = y .
  • (V 4 :$ x) :$ yявляє собою природне x + y .
  • (V 5 :$ x) :$ yявляє собою природне xy .
  • V 6 :$ xявляє собою природне S ( x ) = x + 1.
  • V 7 репресує природний 0.

У середовищі з i вільними змінними ми кодуємо вирази, пропозиції та докази як 2 × 2 цілочисельні матриці [1, 0; a , b ] наступним чином:

  • M ( i , ∀ x [ P ( x )]) = [1, 0; 1, 4] ⋅ M ( i , λ x [P (x)])
  • M ( i , λ x [ F ( x )]) = M ( i + 1, F ( x )), де M ( j , x ) = [1, 0; 5 + i , 4 + j ] для всіх j > i
  • M ( i , PQ ) = [1, 0; 2, 4] ⋅ M ( i , P ) ⋅ M ( i , Q )
  • M ( i , ¬ P ) = [1, 0; 3, 4] ⋅ M ( i , P )
  • M ( i , x = y ) = [1, 0; 4, 4] ⋅ M ( i , x ) ⋅ M ( i , y )
  • M ( i , x + y ) = [1, 0; 1, 4 + i ] ⋅ M ( i , x ) ⋅ M ( i , y )
  • М ( я , xy ) = [1, 0; 2, 4 + i ] ⋅ M ( i , x ) ⋅ M ( i , y )
  • M ( i , S x ) = [1, 0; 3, 4 + i ] ⋅ M ( i , x )
  • M ( i , 0) = [1, 0; 4, 4 + i ]
  • M ( i , ( Γ , P ) ⊢ P ) = [1, 0; 1, 4]
  • M ( i , ΓP ) = [1, 0; 2, 4] ⋅ M ( i , Q ) ⋅ M ( i , ΓQ ) ⋅ M ( i , ΓQP )
  • M ( i , ΓP ( x )) = [1, 0; 3, 4] ⋅ M ( i , λ x [P (x)]) ⋅ M ( i , x ) ⋅ [1, 0; 1, 2] ⋅ M ( i , Γ ⊢ ∀ x P (x))
  • M ( i , ΓP ( x )) = [1, 0; 3, 4] ⋅ M ( i , λ x [P (x)]) ⋅ M ( i , x ) ⋅ [1, 0; 2, 2] ⋅ M ( i , y ) ⋅ M ( i , Γy = x ) ⋅ M ( i , ΓP ( y ))
  • M ( i , Γ ⊢ ∀ x , P ( x )) = [1, 0; 8, 8] ⋅ M ( i , λ x [ ΓP ( x )])
  • M ( i , Γ ⊢ ∀ x , P ( x )) = [1, 0; 12, 8] ⋅ M ( i , ΓP (0)) ⋅ M ( i , λ x [( Γ , P ( x )) ⊢ P (S ( x ))]]
  • M ( i , ΓPQ ) = [1, 0; 8, 8] ⋅ M ( i , ( Γ , P ) ⊢ Q )
  • M ( i , ΓPQ ) = [1, 0; 12, 8] ⋅ M ( i , ( Γ , ¬ Q ) ⊢ ¬ P )

Решта аксіоми кодуються чисельно і включаються в початкове середовище Γ :

  • M (0, ∀ x [ x = x ]) = [1, 0; 497, 400]
  • M (0, ∀ x [¬ (S ( x ) = 0)]) = [1, 0; 8269, 8000]
  • M (0, ∀ xy [S ( x ) = S ( y ) → x = y ]) = [1, 0; 56106533, 47775744]
  • М (0, ∀ x [ x + 0 = x ]) = [1, 0; 12033, 10000]
  • M (0, ∀ y [ x + S ( y ) = S ( x + y )]) = [1, 0; 123263749, 107495424]
  • М (0, ∀ x [ x ⋅ 0 = 0]) = [1, 0; 10049, 10000]
  • M (0, ∀ xy [ x ⋅ S ( y ) = x y + x ]) = [1, 0; 661072709, 644972544]

Доказ з матрицею [1, 0; a , b ] можна перевірити, задавши лише лівий нижній кут A (або будь-яке інше значення конгруентно з по модулю б ); інші значення є для того, щоб увімкнути композицію доказів.

Наприклад, ось доказ того, що додавання є комутативним.

  • M (0, Γ ⊢ ∀ xy [ x + y = y + x]) = [1, 0; 6651439985424903472274778830412211286042729801174124932726010503641310445578492460637276210966154277204244776748283051731165114392766752978964153601068040044362776324924904132311711526476930755026298356469866717434090029353415862307981531900946916847172554628759434336793920402956876846292776619877110678804972343426850350512203833644, 14010499234317302152403198529613715336094817740448888109376168978138227692104106788277363562889534501599380268163213618740021570705080096139804941973102814335632180523847407060058534443254569282138051511292576687428837652027900127452656255880653718107444964680660904752950049505280000000000000000000000000000000000000000000000000000000]

Ви можете перевірити це за допомогою програми наступним чином:

*Main> let p = A $ \x -> A $ \y -> V 3 :$ (V 4 :$ x :$ y) :$ (V 4 :$ y :$ x)
*Main> let a = 6651439985424903472274778830412211286042729801174124932726010503641310445578492460637276210966154277204244776748283051731165114392766752978964153601068040044362776324924904132311711526476930755026298356469866717434090029353415862307981531900946916847172554628759434336793920402956876846292776619877110678804972343426850350512203833644
*Main> r(8?map fst(r(y 8)=<<[497,8269,56106533,12033,123263749,10049,661072709])$p)a :: [((),Integer)]
[((),0)]

Якщо доказ був недійсним, ви отримаєте порожній список.


1
Поясніть, будь ласка, ідею матриць.
гордий haskeller

2
@proudhaskeller Це просто зручний, порівняно компактний спосіб Gödel, який нумерує всі можливі дерева з доказів. Ви також можете вважати їх мішаними числами, що розшифровуються з найменш значущої сторони, використовуючи div та mod за кількістю можливих варіантів на кожному кроці.
Андерс Касеорг

Як ви кодували аксіоми індукції?
PyRulez

@PyRulez M (i, Γ ⊢ ∀x, P (x)) = [1, 0; 12, 8] ⋅ M (i, Γ ⊢ P (0)) ⋅ M (i, λx [(Γ, P (x)) ⊢ P (S (x))]] - аксіома індукції.
Anders Kaseorg

Я думаю, ви могли б зробити це меншим, якщо замість цього використаєте Calculus of Constructions (оскільки Calculus of Constructions має вбудовану логіку першого порядку і дуже мала). Обчислення конструкцій настільки ж сильне, як і ZFC, тому його послідовність, безумовно, не залежить від ПТ. Щоб перевірити, чи є його консистенція, ви просто шукаєте термін порожнього типу.
PyRulez
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.