Il s'agit d'un défi de flics et de voleurs basé sur la définition des langages et la preuve qu'ils sont Turing complets.
Ceci est le fil des flics. Le fil des voleurs est ici .
Flics
En tant que flic, vous préparerez deux choses:
Spécification formelle d'un langage de programmation ou d'un autre système informatique. (Les systèmes informatiques sont définis ci-dessous.)
Une preuve que votre système est Turing complet, selon la définition un peu stricte ci-dessous.
Vous publierez votre spécification de votre langue, et les voleurs essaieront de la "casser" en prouvant son intégralité Turing. Si votre soumission n'est pas fissurée dans une semaine, vous pouvez la marquer comme sûre et poster votre preuve. (Votre réponse peut être invalidée si quelqu'un trouve une faille dans votre preuve, à moins que vous ne puissiez la corriger.)
Il s'agit d'un concours de popularité , donc le gagnant sera la réponse qui aura le plus de votes, et qui n'est ni fêlée ni invalidée. Le défi est illimité - je n'accepterai pas de réponse.
Pour relever ce défi, un système informatique sera défini comme quatre éléments:
Un "ensemble de programmes"
P
. Ce sera un ensemble infiniment dénombrable, par exemple des chaînes, des entiers, des arbres binaires, des configurations de pixels sur une grille, etc. (Mais voir la restriction technique ci-dessous.)Un "ensemble d'entrée"
I
, qui sera également un ensemble infiniment comptable, et n'a pas besoin d'être le même ensemble queP
(bien qu'il puisse l'être).Un "ensemble de sortie"
O
, qui de la même façon sera un ensemble infiniment dénombrable, et peut être ou ne pas être identique àP
ouI
Une procédure déterministe, mécaniste pour produire une sortie
o
de programmep
et d' entréei
, oùp
,i
eto
sont membresP
,I
etO
respectivement. Cette procédure devrait être telle qu'elle pourrait, en principe, être mise en œuvre sur une machine de Turing ou tout autre modèle abstrait de calcul. La procédure peut, bien sûr, ne pas s'arrêter, selon le programme et son entrée.
Les ensembles P
, I
et O
doivent être tels que vous pouvez les exprimer sous forme de chaînes d'une manière calculable. (Pour la plupart des choix judicieux, cela n'aura pas d'importance; cette règle existe pour vous empêcher de choisir des ensembles étranges, tels que l'ensemble des machines de Turing qui ne s'arrêtent pas.)
L'exhaustivité de Turing sera définie comme suit:
- Pour toute fonction partielle calculable à
f
partirI
deO
, il existe un programmep
deP
telle sorte que donnép
et l' entréei
, la sortie estf(i)
sif(i)
une valeur. (Sinon, le programme ne s'arrête pas.)
Le mot "calculable" dans la définition ci-dessus signifie "peut être calculé à l'aide d'une machine de Turing".
Notez que ni la règle 110 ni la balise cyclique au niveau du bit ne sont Turing-complete selon cette définition, car elles n'ont pas la structure d'entrée-sortie requise. Le calcul lambda est Turing complet, tant que nous définissons I
et que nous sommes O
les chiffres de l' Église . (Ce n'est pas Turing-complete si nous prenons I
et O
pour être des expressions lambda en général.)
Notez que vous n'êtes pas obligé de fournir une implémentation de votre langue, mais vous pouvez en inclure une dans votre réponse si vous le souhaitez. Cependant, vous ne devez pas vous fier à l'implémentation pour définir le langage de quelque façon que ce soit - la spécification doit être complète en elle-même, et s'il y a une contradiction entre la spécification et l'implémentation, cela doit être traité comme un bogue dans l'implémentation.