Дискретность. Процесс решения задачи должен быть разбит на последовательность отдельных шагов-команд, которые выполняются одна за другой. Только после завершения одной команды начинается выполнение следующей.
Понятность. Алгоритм должен содержать только те команды, которые известны исполнителю.
Детерминированность. Каждый шаг и переход от шага к шагу должны быть точно определены, чтобы его мог выполнить любой другой человек или механическое устройство. У исполнителя нет возможности принимать самостоятельное решение (алгоритм исполняется формально).
Конечность. Обычно предполагают, что алгоритм заканчивает работу за конечное число шагов. Результат работы алгоритма также должен быть получен за конечное время. Можно расширить понятие алгоритма до понятия процесса, который по различным каналам получает данные, выводит данные и потенциально может не заканчивать свою работу.
Массовость. Алгоритм должен решать не одну частную задачу, а класс задач. Не имеет смысла строить алгоритм нахождения наибольшего общего делителя только для чисел 10 и 15.
Объяснение:
Как мы знаем, в логических выражениях '+' - это '∨', а '*' - это '∧' (строго говоря это не всегда так, и логика множеств и функций в этом не совпадают, но тут нам это неважно). Я буду писать ∨ и ∧ т.к. тут это правильнее и стоит сразу привыкать к общепринятым обозначениям.
Рассмотрим внимательнее это выражение
(a ∨ (a ∧ b)) ∧ (¬(a ∧ b) ∨ b)
Воспользуемся правилом Де-Моргана, которое гласит:
¬( a ∧ b) = ¬a ∨ ¬b
подставим
(a ∨ (a ∧ b)) ∧ (¬a ∨ ¬b ∨ b)
Дальше отметим, что
¬b ∨ b = 1
(a ∨ (a ∧ b)) ∧ (¬a ∨ 1)
Так же знаем, что A ∨ 1 = 1, а A ∧ 1 = A, A ∨ A = A
(a ∨ (a ∧ b)) ∧ 1 = (a ∨ (a ∧ b))
Следовательно наше выражение пришло к виду
a ∨ (a ∧ b) , также, используя дистрибутивность можно написать это выражение как
a ∨ (a ∧ b) = ( a ∨ a) ∧ ( a ∨ b) = a ∧ (a ∨ b)