Кіріспе
BlooP (Шектелген цикл) және FlooP (Еркін цикл) – Дуглас Хофстадтер өзінің «Гёдель, Эшер, Бах» кітабындағы бір ойын түсіндіру үшін жасаған қарапайым бағдарламалау тілдері. BlooP – Тьюринг толық емес бағдарламалау тілі, оның негізгі басқару ағыны құрылымы – шектелген цикл (яғни рекурсияға жол жоқ). Тілдегі барлық бағдарламалар міндетті түрде аяқталуы керек, ал бұл тіл тек примитивті рекурсивті функцияларды ғана бейнелей алады. FlooP, BlooP-тан өзгешелігі, ол шексіз циклдарды қолдайды; бұл Тьюринг толық тіл және барлық есептелетін функцияларды бейнелей алады. Мысалы, ол Акерманн функциясын бейнелей алады, ол (примитивті рекурсивті емес болғандықтан) BlooP-та жазылмайды. Математикалық логикадағы қабылданған терминологияны пайдаланып, Хофстадтер FlooP-тың шексіз циклдарын MU циклдері деп атайды. Барлық Тьюринг толық бағдарламалау тілдері сияқты, FlooP тоқтау мәселесінен зардап шегеді: бағдарламалар тоқтамауы мүмкін, және жалпы жағдайда, қай бағдарламалар аяқталады, оны анықтау мүмкін емес. BlooP және FlooP есептеу модельдері ретінде қарастырылуы мүмкін және кейде есептеу теориясын оқытуда қолданылады.
BlooP (Bounded loop) and FlooP (Free loop) (Bounded loop and Free loop) are simple programming languages designed by Douglas Hofstadter to illustrate a point in his book Gödel, Escher, Bach. BlooP is a non Turing complete programming language whose main control flow structure is a bounded loop (i. e. recursion is not permitted). All programs in the language must terminate, and this language can only express primitive recursive functions. FlooP is identical to BlooP except that it supports unbounded loops; it is a Turing complete language and can express all computable functions. For example, it can express the Ackermann function, which (not being primitive recursive) cannot be written in BlooP. Borrowing from standard terminology in mathematical logic, Hofstadter calls FlooP's unbounded loops MU loops. Like all Turing complete programming languages, FlooP suffers from the halting problem: programs might not terminate, and it is not possible, in general, to decide which programs do. BlooP and FlooP can be regarded as models of computation, and have sometimes been used in teaching computability.
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 циклден толығымен шығады.