Pot^.next:=nil; {указываем, что это понятие последнее в списке}
Pot^.p:=I {указываем количество элементов, содержащихся в понятии}
End
End;
Forj:=k1-1 downto 2 dobegin {k1 сейчас показывает количество подпонятий последнего понятия плюс 1. Поэтому в этом цикле, который попытается определить следующую комбинацию понятий и используется переменная k1. Эта часть программы рассматривает случай, когда подпонятия будут ставать не следующими по списку подпонятиями (по крайней мере не все), а будут происходить другие переходы. То есть этот цикл рассчитан на то, чтобы не позволить подпонятию с большим номером по списку в понятии быть большим по абсолютному адресу (по времени создания)}
If (str1[j]^.next=str1[j-1]) and (str1[j+1]=str1[j]) or ((j=k1-1) and (str1[j]<>
Str1[j-1])) thenbegin {если за подпонятием с номером jпо списку следует подпонятие с номером j-1 и подпонятия с номером jи j+1 совпадают, или jравно количеству подпонятий и последние два понятия совпадают (сравнение идет по абсолютным адресам расположения понятий в памяти), то}
str1[j]:=str1[j]^.next; {подпонятие с номером jпереходит на следующее за списком подпонятие}
Forj:=J+1 tok1-1 dostr1[j]:=f; {а все следующие подпонятия, становятся равными первому (элементарному) подпонятию}
gotomet {хотя применение оператора безусловного перехода считается плохим стилем программирования, но здесь он оправдан, дабы не запутывать программу новыми циклами}
End;
End;
Forj:=k1-1 downto 2 dobegin {новый цикл, который переключит соответствующие подпонятия. Мы выделяем это в новый цикл, так как нужно было проверить на наличие “граничных” переходов (см. предыдущий цикл)}
Ifstr1[j]<>str1[j-1]thenbegin { если подпонятия с номерами jи (j-1) не совпадают, то}
Str1[j]:=str1[j]^.next; {подпонятие с номером j становится следующим по списку (времени создания подпонятием)}
Forj:=j+1 tok1 dostr1[j]:=f; {а все идущие за ним подпонятия в списке подпонятий, составляющих понятие становятся элементарными}
gotomet {выходим из цикла}
End
End;
Str1[1]:=str1[1]^.next; {если не выполнились условия предыдущих двух циклов, то пора переключать первое подпонятие}
forj:=2 toidostr1[j]:=f; {и, соответствено, следующие подпонятия сделать элементарными}
Met: end
End;
Close(fil);{закрытьфайл}
Repeat {и}
Pot:=f^.next;
Dispose(f); {освободить память, занимаемую списком всех возможных подпонятий}
F:=pot
Until f<>nil
end.
1. В. Липский, Комбинаторика для программистов, пер. с польского, М. – Мир,1988