Тема 15. Алгебра логики – преобразование логических выражений

15.07 Прочие прототипы

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела алгебра логики – преобразование логических выражений
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#63718

Обозначим через ДЕЛ(n  , m  ) утверждение «натуральное число n  делится без остатка на натуральное число m  ».

На числовой прямой дан промежуток A  и множество S = {25,28,45,48,57,67} .

Определите максимальную длину промежутка A  , такого что его правая граница не больше 50  и выражение

                                                                -------
((¬Д ЕЛ(x,5)∧ (y ∕∈ S)) → ((x > 5) → (y > 13)))∨ (x⋅y ≤ 67)∨(x ∕∈ A)∨ (y ∈ A)

тождественно истинно, то есть принимает значение 1  при любых натуральных значениях переменных x  , y  .

Показать ответ и решение

Решение программой

1. Мы создаем функцию inn(x, A), которая проверяет, принадлежит ли число x  промежутку A  . Эта функция возвращает True, если x  находится между границами A  , и False в противном случае. Это позволяет удобно проверять условия x ∈ A  и y ∈ A  .

2. Определяем функцию f(x, y, A), которая проверяет истинность формулы для конкретных значений x  , y  и отрезка A  :

- Проверяем, что x  не делится на 5 и y ∕∈ S  , тогда должно выполняться условие x > 5 → y > 13  ;

- Объединяем с проверкой дополнительной части формулы: x ⋅y ≤ 67  , либо x ∕∈ A  , либо y ∕∈ A  ;

- Если хотя бы одно из условий истинно, функция возвращает True, что соответствует тождественной истинности для данной пары (x,y)  .

3. Задаем дискретизацию чисел для отрезка A  с шагом 1∕n  , где n = 5  , чтобы корректно работать с дробными числами при проверках и обеспечить возможность точного перебора всех кандидатов для A  .

4. Перебираем все возможные начала a  и концы b  отрезка A  в диапазоне от 1  до 50  , учитывая дискретизацию:

- Для каждого кандидата A = [a∕n,b∕n]  проверяем формулу для всех натуральных чисел x  и y  в диапазоне x ∈ [1,99]  , y ∈ [1,14]  ;

- Если формула ложна хотя бы для одной пары (x,y)  , отрезок A  отбрасывается.

5. Если формула выполняется для всех (x,y)  , вычисляем длину текущего отрезка A  и обновляем максимальную длину, если она больше предыдущей найденной.

6. После перебора всех вариантов выводим максимальную длину промежутка A  .

# Функция проверки принадлежности x промежутку A
def inn(x, A):
    # Возвращает True, если x находится между границами A[0] и A[1]
    return A[0] <= x <= A[1]

# Функция проверки истинности формулы для конкретных x, y и промежутка A
def f(x, y, A):
    S = {25, 28, 45, 48, 57, 67}  # Множество S
    # Проверяем первую часть формулы: если x не делится на 5 и y не в S, то x>5 => y>13
    # Объединяем с дополнительными условиями: x*y <= 67, x не в A или y не в A
    return (((x % 5 != 0) and (not y in S)) <= ((x > 5) <= (y > 13))) \
        or (x * y <= 67) or (not inn(x, A)) or (not inn(y, A))

# Задаем дискретизацию для перебора дробных значений отрезка A
n = 5
ans = 0  # Максимальная длина промежутка A

# Перебор начала отрезка a с учетом дискретизации
for a in range(1 * n, 50 * n):
    # Перебор конца отрезка b с учетом, что правая граница не больше 50
    for b in range(a, 50 * n + 1):  # +1 чтобы проверить саму точку b
        A = [a / n, b / n]  # Создаем текущий отрезок A
        flag = True  # Флаг, показывающий, что формула выполняется для всех x и y
        # Перебор всех натуральных x в диапазоне [1, 99]
        for x in range(1, 100):
            # Перебор всех натуральных y в диапазоне [1, 14]
            for y in range(1, 15):
                # Если формула ложна для пары (x, y), меняем флаг и прерываем цикл
                if not f(x, y, A):
                    flag = False
                    break
            # Прерываем цикл по x, если флаг равен False
            if not flag:
                break
        # Если формула выполняется для всех (x, y), обновляем максимальную длину
        if flag:
            ans = max(ans, A[1] - A[0])

                                                                                                     
                                                                                                     
# Выводим максимальную длину промежутка A
print(ans)

Видим, что программа выдаёт результат 36.8 – это значит, что ответ стремится к 37.

Ответ: 37

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение

Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!