
- •3. Логика буля и условное выполнение
- •3.1 Сортировка с условным выполнением.
- •3.1.1 Семейство программ ifSort
- •3.1.2. Семейство программ MinSort
- •3.2. Булева логика.
- •3.2.1. Булевы операторы.
- •3.2.2. Булевы выражения.
- •3.2.3. Булевы тождества.
- •3.3. Булевы выражения в cf-Паскале
- •3.3.1. Снова семейство программ MinSort.
- •3.4. Заключение.
3.2. Булева логика.
Булева логика обеспечивает формальный и систематический метод рассуждения об условиях в операторах IF. Этот метод упрощает анализ поведения рограмм.
Новые положения: значения истинности, булевы значения, булевы оперторы NOT, AND, OR, булевы выражения, таблицы истинности, Булевые тождества.
Операторы IF и WHILE служат для условного выполнения в зависимости от результате <условия> во время выполнения.
IF Ch1 <> Ch2
THEN
WRITE(Ch1)
ELSE
WRITE(Ch2)
Такое условие имеет только два возможных результата – оно либо выполняется, либо нет. Условия, с двумя возможными результатами называются Булевыми условиями (Джордж Буль, 1815 – 1864, впервые систематически исследовал этот предмет). Результаты называются значениями истинности (truth values) или Булевыми значениями, с именами TRUE и FALSE. Это значения, принимаемые <условием> в операторах IF или WHILE, в то время как символьные переменные принимают символьные значения. Например, после следующих операторов присвоения:
Ch1 := ‘A’;
Ch2 := ‘С’
Булевы значения будут
<Условие> |
Булево значение |
Ch1 < Ch2 |
TRUE |
Ch1 >= Ch2 |
FALSE |
Ch1 <= Ch2 |
TRUE |
Ch1 = B |
FALSE |
Ch2 = ‘C’ |
TRUE |
‘X’ = ‘Y’ |
FALSE |
Условия и утверждения
В операторе IF могут быть даны следующие комментарии состояния:
IF Ch1 <> Ch2
THEN {Ch1 < Ch2}
WRITE(Ch1)
ELSE {Ch1 >= Ch2}
WRITE(Ch2)
<Условие> Ch1 <> Ch2 в первой строке может принимать значение TRUE либо значение FALSE. Однако комментарий состояния в операторе THEN {Ch1 < Ch2} на следующей строке может быть утверждением того, что условие должно быть равно TRUE на входе в часть THEN оператора IF. Основа для этого утверждения в том, как выполняется оператор IF Паскаль-машиной. Т.е. не важно, что произошло раньше, не важно, какие значения переменных Ch1 и Ch2 могут быть на входе в часть THEN, значения условия Ch1 < Ch2 ДОЛЖНО быть равно TRUE.
3.2.1. Булевы операторы.
Оператор NOT
Ранее упомянутый оператор IF иллюстрирует о том как рассуждать о состоянии значений переменных в программе. Комментарии состояния в части THEN утверждают, что значение Ch1 < Ch2 – это TRUE. Комментарий ELSE отражает наше знание о том, что оператор >= является противоположным оператору <, а FALSE задается как противоположность TRUE. Поэтому, значение Ch2 >= Ch2 является иитинным (TRUE) в то время как значение Ch1 < Ch2 является ложью (FALSE) и наоборот. Булевый оператор NOT меняет значение остинности на противоположное:
NOT(TRUE) = FALSE
NOT(FALSE) = TRUE
NOT – это унарный (применяющийся к одному операнду), префиксный (предшествующий операнду) оператор.
Поскольку
NOT(NOT(FALSE)) = NOT(TRUE) = FALSE
NOT(NOT(TRUE)) = NOT(FALSE) = TRUE
И это единственные возможные варианты, то
NOT(NOT(P)) = P для любого Булева значения P.
Оператор AND
Рассмотрим вложенный оператор IF с комментариями состояния:
IF Ch1 < Ch2
THEN { Ch1 < Ch2 }
IF Ch2 < Ch3
THEN { Ch1 < Ch2 < Ch3 }
WRITE(Ch1)
ELSE { Ch1 < Ch2, Ch3 <= Ch2 }
IF Ch1 < Ch3
THEN { Ch1 < Ch3 <= Ch2 }
WRITE(Ch1_
ELSE { Ch3 <= Ch1 < Ch2 }
WRITE(Ch3)
Комментарий состояния
{Ch1 < Ch2 < Ch3}
выражает два утверждения о том, что значение Ch1 преджествует Ch2 и значение Ch2 предшествует Ch3. Булевый оператор AND захватывает это интуитивное значение. AND – это бинарный (два операнда) инфиксный (расположенный между своими операндами) оператор, который принимает значение TRUE, если значения обоих Булевых операндов являются истинными (TRUE). Во всех остальных случаях он принимает значение FALSE.
TRUE AND TRUE = TRUE
TRUE AND FALSE = FALSE
FALSE AND TRUE = FALSE
FALSE AND FALSE = FALSE
Операции сравнения могут обычно объединяться с оператором AND. Когда одинаковые операнды встречаются в объединенном условии, чаще получается более простое условие с тем же самым значением истинности. Например:
Сравнение, объединенное при помощи AND: |
Более простое эквивалентное сравнение |
||
Ch1 <= Ch2 |
Ch1 >= Ch2 |
Ch1 = Ch2 |
|
Ch1 <= Ch2 |
Ch1 < Ch2 |
Ch1 < Ch2 |
|
Ch1 < Ch2 |
Ch1 > Ch2 |
FALSE |
Более простое сравнение является эквивалентным, поскольку AND требует выполнения обоих объединенных сравнения, включая возможность их противоречия. Во втором случае, эквивалентность операндов не может быть произойти в Ch1<=Ch2, поскольку Ch1 < Ch2 это запрещает.
Оператор OR
В предыдущем операторе IF есть 2 случая, когда оператор WRITE может быть достигнут. Значение Ch1 < Ch2 должно быть TRUE и одно либо оба значения Ch2 < Ch3, Ch1 < Ch3 должны быть TRUE.
Булевый оператор OR – это бинарный инфиксный оператор:
TRUE OR TRUE = TRUE
TRUE OR FALSE = TRUE
FALSE OR TRUE = TRUE
FALSE OR FALSE = FALSE
Вот несколько полезных комбинаций использования OR
Сравнение, объединенное при помощи OR: |
Более простое эквивалентное сравнение |
||
Ch1 < Ch2 |
Ch1 > Ch2 |
Ch1 <> Ch2 |
|
Ch1 <= Ch2 |
Ch1 < Ch2 |
Ch1 <= Ch2 |
|
Ch1 <= Ch2 |
Ch1 => Ch2 |
TRUE |
Таблицы истинности для булевых операторов.
P |
Q |
NOT P |
P AND Q |
P OR Q |
T |
T |
F |
T |
T |
T |
F |
F |
F |
T |
F |
T |
T |
F |
T |
F |
F |
T |
F |
F |