Тип 15 № 11119 

Преобразование логических выражений. Числовые отрезки
i
На числовой прямой даны два отрезка: P = [20, 50] и Q = [30,65]. Отрезок A таков, что формула
¬(x ∈ A) → ((x ∈ P) →¬ (x ∈ Q))
истинна при любом значении переменной x. Какова наименьшая возможная длина отрезка A?
Решение. Введем обозначения:
(x ∈А) ≡ A; (x ∈ P) ≡ P; (x ∈ Q) ≡ Q.
Преобразовав, получаем:
¬A → (¬P ∨ ¬Q) = A ∨ ¬P ∨ ¬Q.
Логическое ИЛИ истинно, если истинно хотя бы одно утверждение. Логическое И истинно, когда истинны оба утверждения. Условию ¬P ∨ ¬Q = 1 удовлетворяют лучи (−∞; 30) и (50; +∞). Поскольку выражение A ∨ ¬P ∨ ¬Q должно быть тождественно истинным, выражение A должно быть истинно на отрезке [30, 50]. Следовательно, наименьшая длина отрезка А равна 50 − 30 = 20.
Ответ: 20.
Примечание 1.
Следует различать задания «найдите длину отрезка» и «найдите количество целых чисел на отрезке».
Длина отрезка равна расстоянию между его граничными точками. Длину отрезка можно вычислить по формуле m−n, где m и n — правая и левая границы этого отрезка соответственно. Длина отрезка не зависит от того, включены ли в него его границы. Заметим, однако, что если границы не включены, то должно использоваться слово «интервал», а не слово «отрезок».
Количество целых чисел на отрезке можно найти по формуле m − n + 1, где m и n — правая и левая границы этого отрезка соответственно, причем они входят в отрезок.
Примечание 2.
Стоит очень внимательно относиться к решению подобных задач с помощью программ, реализующих метод перебора. В программах, которые предлагают наши читатели, в качестве границ отрезка используются целые числа, и длина отрезка определяется как разность между ними. Такие программы будут давать неверный результат, если интервал А не является отрезком, то есть одна или обе из его границ ему не принадлежат. Примером такой задачи является задача 34541.
Приведём решение Ивана Гладких (Черкесск) на языке Python.
m = 10**6
P = [i for i in range(20, 51)]
Q = [i for i in range(30, 66)]
for Amin in range(1, 100):
for Amax in range(Amin + 1, 100):
check = 1
A = [i for i in range(Amin, Amax)]
for x in range(-100, 100):
f = (not(x in A)) <= ((x in P) <= (not(x in Q)))
if not f:
check = 0
break
if check == 1:
m = min(m,Amax - Amin)
print(m-1)
Ответ: 20