Основные понятия математической логики
Скачать 2.32 Mb.
|
Ещё пример задания:Р-28. На числовой прямой даны отрезки A = [70; 90], B = [40; 60] и C = [0; N] и функцияF(x) = ( (x A) (x B) ) ( (x C) (x A) )При каком наименьшем числе N функция F(x) истинна более чем для 30 целых чисел x?Решение: для сокращения записи введём обозначения A = (xA), B = (xB), C = (xC). фактически A(x) – это логическая функция, определяющая принадлежность числа x отрезку A запишем функцию в виде: используя распределительный закон логики, упрощаем: это значит, что функция истинна на всём отрезке A (там 21 целое число) и на общей части отрезков B и C, где должно быть не менее 31 – 21 = 10 целых чисел нарисуем отрезки на числовой оси: по рисунку видно, что при N < 40 отрезки B и Cне имеют общей части при N [40; 60] общая части отрезков B и C– это отрезок [40; N], на нём расположены N – 40 + 1 целых чисел при N > 60 общая части отрезков B и C совпадает с отрезком B, ему принадлежит 21 целое число таким образом, функция F(x) может быть истинной не более чем для 42 целых чисел если требуется обеспечить её истинность для 31 целого числа, нужно выбрать N из условия N – 40 + 1 = 10, откуда N = 49 Ответ: 49. Решение (программа на Python, А.Н. Носкин): Упрощаем выражение: Примем отрезки за множество, тогда все числа отрезков будут элементами соответствующего множества. Сумма количества элементов множества А и количества элементов, которые соответствуют пересечению множеств В и С должна быть более 30. Создадим множества А, В и С: A = {i for i in range(70,91)} #множество A B = {i for i in range(40,61)} # множество B C = set() #множество C В цикле будем добавлять элементы в множество С, пока сумма элементов А + В*С не достигнет более 30. for N in range(90): C.add(N) Если такое число достигнуто, то выводим ответ: if (len(A)+ len(B&C))>30: print(N) break Приведем полную программу: A = {i for i in range(70,91)} # множество A B = {i for i in range(40,61)} # множество B C = set() #множество C for N in range(90): C.add(N) if (len(A)+ len(B&C))>30: print(N) break Ответ: 49. Решение (программа на Python, Е. Джобс): Полный текст программы: # перебираем заведомо больший диапазон чисел for N in range(10000): # если в диапазоне [0; 1000] больше 30 удовлетворяющих чисел if sum( ((not (70 <= x <= 90)) <= (40 <= x <= 60) ) and ((not (0 <= x <= N)) <= (70 <= x <= 90)) for x in range(1000) ) > 30: print(N) # печатаем N break # завершаем алгоритм Ответ: 49. |