Программа как математический объект: Методические указания для самостоятельного изучения темы и выполнения РГР, страница 12

{(( x, y, z), ( u, v, w)) | u=y,v=y, w=z} или в более простой записи так:

{(( x, y, z) , ( y, y, z))}

Заметим, что x, y, z  в левой скобке служат для обозначения определяемых в программе данных, а те же имена , стоящие в правой скобке являются именами значений определяемых данных. Приведённую выше запись нужно понимать так: после выполнения функции присваивания поле x имеет значение поля y , а поля с именами y, z не изменили своих значений. В таком контексте присваивание всегда отображает одно состояние данных в другое состояние.

Несколько примеров записи оператора присваивания в виде функционального отображения:

1) оператор присваивания задан в виде условного правила

(x ³ 0 L y ³ 0 L z ³ 0 ® x := y )

{((x, y, z), (y, y, z)) | x ³ 0 L y ³ 0 L z ³ 0}

2) оператор присваивания задан для скалярых переменных  x, y, z  целого типа, значения этих переменных принадлежат области натуральных чисел :              

(x := y - z) = {((x, y, z), (y - z, y, z) | x ³ 0 L y ³ 0 L z ³ 0 L y -z ³ 0}

3) оператор присваивания задан c использованием других функций

(x := max(y, z))= {((x, y, z), ( max(y,z),y, z))}, где функция max определяется

max = {((y, z)(u)) | ( y ³ z L u =y )V (z ³ y L u=z)}

4) оператор присваивания над массивами с использованием индексных переменных

i, x(i+1) := x(i), i+x(i+1) можно рассматривать как функцию, изменяющую состояние поля данных, включающего по крайней мере четырёхэлементный список (i, x(1), x(2), X(3)), который содержит и индекс. Окончательное выражение для предложения присваивания может быть задано в форме условного правила

(i=1®i, x(2):= x(1),1+X(2) | i=2 ®i, x(3):= x(2),2+X(3))

( Так как x(i+1) для i>2 не определено, функция присваивания для любого начального значения i, не равного 1 или 2, является неопределённой). В этом случае функция присваивания контролирует правильность использования операции присваивания над массивами.

3.2.4  Программные функции

Любую простую программу можно рассматривать как функцию, которая отображает множество входных состояний данных, обозначаемых X в множество  состояний выходных данных, в дальнейшем обозначаемых Y.  Множество всех упорядоченных пар {(X,Y)} опред функциональное множество, так как отоброжение X в Y однозначно. Эту функцию будем называть  программной функцией  и будем обозначать [P].

Рассмотрим некоторые  программные функции для программ, записанных на языке PDL. При этом для  описания программных функций используются множество упорядоченных пар и операция присваивания, а также условные правила, где это необходимо:

1) [x:= x + y; y:= x - y] = {((x, y), (x + y, x))} = (x, y:= x + y, x)

2) [if x > y then x := y fi] = {((x, y), (min(x, y), y)}= (x,y:= min(x, y),y)

3) [while x< 0 do x:= x +1 od]={(x), (max ( 0, x))} = (x:= max(0, x))

4) [while x¹ 0 do x:= x +1 od]={(x, 0) | x £ 0} = (x£0 ® x:=0)

5) [do x:= x +1 until x > y od]={((x, y), (max(x + 1, y +1), y))}=

                                                                      (x, y:= max(x + 1, y + 1), y)

6) [do x:= x +1 until x ¹ y od]={((x, y), (x + 1, y) | x ¹ y - 1}

                                                        È {((x, y), (y + 1, y) | x = y - 1}=

                                                            (x ¹ y - 1® x, y:= x +1, y | x =  y - 1® x, y:= y +1, y)

При описании программных функций программ, заданных схемой можно использовать язык  исчисления высказывания или условные правила.

 Программа, состоящая из одного функционального узла (рис. 11) f={(X,Y)} имеет программную функцию [P]={(X, Y) | Y= f(X)}.

 Программной функцией последовательности двух функциональных узлов (рис. 12), где g={(X, Z)}, h={(Z, Y)}, является композиция двух частных функций [P] = {(X, Y) | Y= h(g(X))} .

Программная функция схем без циклов может быть определена как объединения композиций функций, которые могут быть получены из  Е - схемы. При этом необходимо описать функцию каждой ветви этой схемы. При этом, необходимые и достаточные  условия выполнения данной  ветви определяются  композицией каждого предиката, принадлежащего этой ветки, с предшествующими функциональными узлами , а композиция всех функциональных узлов данной ветки  дерева задаёт часть программной функции.