tr 1 [ k 1] ^. p ; {
додати розмірність, доданого подпонятія }
Inc ( k 1); { збільшити k 1 на 1 }
End ;
If ( sum > i ) i> or ( k 1 = 2) then begin { якщо кількість елементів отриманого поняття більше розмірності завдання або k 1 = 2 , тобто додано тільки одне поняття в подпонятіе, то, щоб уникнути зайвих дужок і неправильних рішень виконати }
Dispose ( pot ^. next ); { звільнити пам'ять, займану цим В«НеправильнимВ» поняттям }
Pot ^. next : = nil ; { вказати, що попереднє поняття було останнім }
If k 1 = 2 then break {< b> якщо k 1 = 2 , то вийти з основного циклу програми }
End
Else begin
If i = POW then begin { якщо розмірність поточної підзадачі дорівнює розмірності основного завдання, то }
Writeln ( fil , pot ^. i> next ^. s ); { записати поняття в файл }
Writeln ( pot ^. next ^. s ); { і вивести на екран }
Dispose ( pot ^. next ); { звільнити пам'ять, займану поняттям , так як поняття розмірності задачі нам больше не знадобляться }
Pot ^. next: = nil
End
Else begin { інакше инициализируем поняття до кінця }
Pot: = pot ^. next;
Pot ^. s: = pot ^. s + ')'; { закриваємо дужку }
Pot ^. next : = nil ; { Вказуємо, що це поняття останнім у списку }
Pot ^. p : = I {< b> вказуємо кількість елементів, містяться в понятті }
End
End ;
For j : = k 1-1 downto 2 do begin { k 1 зараз показує кількість подпонятій останнього поняття плюс 1. Тому в цьому циклі, який спробує визначити наступну комбінацію понять і використовується змінна k 1. Ця частина програми розглядає випадок, коли подпонятія будуть ставати НЕ наступними за списком подпонятіямі (принаймні не всі), а будуть відбуватися інші переходи. Тобто цей цикл розрахований на те, щоб не дозволити подпонятію з великим номером за списком у понятті бути великим за абсолютним адресою (за часом створення) }
В
If (Str1 [j] ^. Next = str1 [j-1]) and (str1 [j +1] = str1 [j]) or ((J = k1-1) and (str1 [j] <>
Str 1 [ j -1])) then begin { якщо за подпонятіем з номером j за списком слід подпонятіе з номером j -1 і подпонятія з номером j і j + 1 збігаються, або j дорівнює кількості подпонятій і останні два поняття збігаються (порівняння йде за абсолютними адресами розташування понять в пам'яті), то }
str 1 [ j ]: = str 1 [ j ] ^. next ; { подпонятіе з номером j переходить на наступне за списком подпонятіе }
For j : = J +1 to k 1-1 do str 1 [ j ]: = f ; { а всі наступні подпонятія, стають рівними першому (елементарному) подпонятію }
goto met { хоча застосування оператора безумовного переходу вважається поганим стилем програмування, але тут він виправданий, щоб НЕ заплутувати програму новими циклами }
End ;
End ;
For j : = k 1-1 downto 2 do begin { нов и й цикл, який перемкне відповідні подпонятія. Ми виділяємо це в новий цикл, так як потрібно було перевірити на наявність "граничнихВ» переходів (Див....