Кіріспе

BlooP (Шектелген цикл) және FlooP (Еркін цикл) – Дуглас Хофстадтер өзінің «Гёдель, Эшер, Бах» кітабындағы бір ойын түсіндіру үшін жасаған қарапайым бағдарламалау тілдері. BlooP – Тьюринг толық емес бағдарламалау тілі, оның негізгі басқару ағыны құрылымы – шектелген цикл (яғни рекурсияға жол жоқ). Тілдегі барлық бағдарламалар міндетті түрде аяқталуы керек, ал бұл тіл тек примитивті рекурсивті функцияларды ғана бейнелей алады. FlooP, BlooP-тан өзгешелігі, ол шексіз циклдарды қолдайды; бұл Тьюринг толық тіл және барлық есептелетін функцияларды бейнелей алады. Мысалы, ол Акерманн функциясын бейнелей алады, ол (примитивті рекурсивті емес болғандықтан) BlooP-та жазылмайды. Математикалық логикадағы қабылданған терминологияны пайдаланып, Хофстадтер FlooP-тың шексіз циклдарын MU циклдері деп атайды. Барлық Тьюринг толық бағдарламалау тілдері сияқты, FlooP тоқтау мәселесінен зардап шегеді: бағдарламалар тоқтамауы мүмкін, және жалпы жағдайда, қай бағдарламалар аяқталады, оны анықтау мүмкін емес. BlooP және FlooP есептеу модельдері ретінде қарастырылуы мүмкін және кейде есептеу теориясын оқытуда қолданылады.

BlooP мысалдары

Тек OUTPUT (процедураның қайтарылатын мәні) және CELL(i) (шексіз регистрлік машинадағыдай, тұрақтылар арқылы индекстелген, табиғи сандардың шексіз тізбегі) айнымалылары ғана бар. Операторлар: ⇐ (тапсыру), + (қосу), × (көбейту), < (кем), > (көп) және = (тең). Әрбір бағдарлама тек шектеулі ұяшықтарды пайдаланады, бірақ ұяшықтардағы сандар кез келген деңгейде үлкен болуы мүмкін. Тізімдер немесе стектер сияқты дерек құрылымдарын ұяшықтағы санды белгілі бір тәсілмен түсіндіру арқылы басқаруға болады, яғни Гёдель нөмірлеуі арқылы мүмкін құрылымдарды кодтау арқылы. Бақылау ағыны құрылымдарына шектелген циклдар, шартты операторлар, циклдардан ABORT секірулері және блоктардан QUIT секірулері кіреді. BlooP рекурсияға, шексіз секірулерге немесе FlooP-тың шексіз циклдерімен бірдей әсер ететін басқа да нәрселерге рұқсат бермейді. Аталған процедураларды анықтауға болады, бірақ олар тек бұрын анықталған процедураларды ғана шақыра алады.

Алу функциясы

Бұл құрастырылған операция емес және (натурал сандармен анықталғандықтан) ешқашан теріс нәтиже бермейді (мысалы, 2 - 3 := 0). OUTPUT, барлық CELL-дер сияқты, 0-ден басталатынын ескеріңіз, демек бастапқы мәнін берудің қажеті жоқ.

FlooP мысалы

Акерманн функциясын іске асыратын төмендегі мысал, Гёдель нөмірлеуін пайдалана отырып, стекті модельдеуге негізделген: яғни, бұрын анықталған сандық функциялар PUSH, POP және TOP шарттарын қанағаттандыратын PUSH [N, S] > 0, TOP [PUSH [N, S]] = N және POP [PUSH [N, S]] = S. Шегі жоқ MU LOOP қолданылғандықтан, бұл заңды BlooP бағдарламасы емес. Осы жағдайда QUIT BLOCK командалары блок соңына секіріп, циклді қайтадан орындайды, ал ABORT циклден толығымен шығады.