Значение логических выражений.
Значение логического выражения задается следующим рекурсивным определением. Для любого состояния выполнения S:
E1 = E2(S) = (E1(S) = E2(S))
E1 <> E2(S) = (E1(S) ¹ E2(S))
E1 < E2(S) = (E1(S) < E2(S))
E1 <= E2(S) = (E1(S) ≤ E2(S))
E1 > E2(S) = (E1(S) > E2(S))
E1 >= E2(S) = (E1(S) ≥ E2(S))
E1 OR E2(S) = (E1(S) OR E2(S))
NOT E (S) = NOT E (S)
(E) (S) = E (S)
Операторы в левой части – те, что встречаются в Паскаль-программах. Те, которые в правой части – математические операции. Это определение дает значение каждого ператора по отдельности, но не указывает как будет вычисляться выражение с несколькими операторами. Ассоциативность и приоритет операторов в выражении определяется синтаксическими правилами Паскаля. Программное исчисление требут чтобы все операторы были определены, в противном случае математические свойства такие как коммутативность, (которую мы сипользуем чаще, чем предполагаем) нарушаются.
Ввод-вывод логических значений.
Логичесике переменные не могут появляться в операторах READ, но логические выражения могут появляться в операторах WRITE. Логические значения преобразуются в символы и выравниваются по правой стороне строки, длина которой зависит от реализации Паскаль-машины (например, 10 символов).
Последовательность операторов:
Condition := TRUE;
WRITE(Condition);
Добавляет строку † TRUE† в OUTPUT.
Поиск в файле.
Программа SarahRevere в части 2 распознает слова land и sea в INPUT. Разделы проекта этой программы переработаны с использованием логических перемнных и собраны вновь ниже.
PROGRAM SarahRevere(INPUT, OUTPUT);
VAR
W1, W2, W3, W4: CHAR;
Looking, Land, Sea: BOOLEAN;
BEGIN {SarahRevere}
BEGIN {Инициализируем W1, W2, W3, W4}
W1 := ‘ ‘;
W2 := ‘ ‘;
W3 := ‘ ‘;
W4 := ‘ ‘;
Looking := TRUE;
Land := FALSE;
Sea := FALSE;
END;
WHILE Looking AND NOT (Land OR Sea)
DO
BEGIN
BEGIN {движение окна, проверка на конец данных}
W1 := W2;
W2 := W3;
W3 := W4;
READ(W4);
Looking := W4 <> ‘#’
END;
BEGIN {проверка окна на land}
Land := (W1 = ‘l’) AND (W2 = ‘a’) AND
(W3 = ‘n’) AND (w4 = ‘d’)
END;
BEGIN {проверка окна на sea}
Sea := (W1 = ‘s’) AND (W2 = ‘e’) AND (W3 = ‘a’)
END;
END;
BEGIN {создание сообщения Sarah}
IF Land
THEN
WRITELN(‘The british are coming by land.’)
ELSE
IF Sea
THEN
WRITELN(‘The british are coming by sea.’)
ELSE
WRITELN(‘Sarah didn’t say.’)
END
END. {SarahRevere}
Оператор WHILE управляется выражением:
Looking AND NOT (Land OR Sea)
которое разрешает телу цикла выплняться до тех пор пока значение Looking равно TRUE и оба значения Land и Sea равны FALSE. Looking присваивается значение False когда встречается #:
Looking := W4 <> ‘#’
Land и Sea присваивается TRUE если W1, W2, W3, W4 содержат соотвествующую строку.
Использование логических переменных сократило программу с 57 строк до 43.