Ссылка: https://inf-ege.sdamgia.ru/test?theme=354
В задаче на монотонную функцию логическое выражение F принимает либо true (1), либо false (0). Эта особенность задачи значительно упрощает решение за счет сужения круга возможных вариантов.
https://inf-ege.sdamgia.ru/problem?id=9752
Логическая функция F задаётся выражением:
(¬x ∧ y ∧ z) ∨ (¬x ∧ ¬y ∧ z) ∨ (¬x ∧ ¬y ∧ ¬z).
На рисунке приведён фрагмент таблицы истинности функции F, содержащий все наборы аргументов, при которых функция F истинна.
Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных x, y, z.
Перем. 1 | Перем. 2 | Перем. 3 | Функция |
---|---|---|---|
??? | ??? | ??? | F |
0 | 0 | 0 | 1 |
1 | 0 | 0 | 1 |
1 | 0 | 1 | 1 |
В ответе напишите буквы x, y, z в том порядке, в котором идут соответствующие им столбцы (сначала – буква, соответствующая первому столбцу, затем – буква, соответствующая второму столбцу, и т. д.) Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
Пример. Пусть задано выражение x → y, зависящее от двух переменных x и y, и таблица истинности:
Перем. 1 | Перем. 2 | Функция |
---|---|---|
??? | ??? | F |
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 1 |
1 | 1 | 1 |
Тогда 1-му столбцу соответствует переменная y, а 2-му столбцу соответствует переменная x. В ответе нужно написать: yx.
# из пакета itertools импортируем функцию product
from itertools import product
# foo - это все возмоные комбинации переменных x, y, z
foo = list(product([0, 1], repeat=3))
g = lambda x: 1 if x else 0 # пребразование true/false => 1/0
# логическое выражение:
f = lambda x, y, z: g((not x and y and z) or (not x and not y and z) or (not x and not y and not z))
for bar in foo:
if f(*bar) == 1:
print(bar, f(*bar))
(0, 0, 0) 1 (0, 0, 1) 1 (0, 1, 1) 1
# меняем x и y:
f = lambda y, x, z: g((not x and y and z) or (not x and not y and z) or (not x and not y and not z))
for bar in foo:
if f(*bar) == 1:
print(bar, f(*bar))
(0, 0, 0) 1 (0, 0, 1) 1 (1, 0, 1) 1
# меняем y и z:
f = lambda z, x, y: g((not x and y and z) or (not x and not y and z) or (not x and not y and not z))
for bar in foo:
if f(*bar) == 1:
print(bar, f(*bar))
(0, 0, 0) 1 (1, 0, 0) 1 (1, 0, 1) 1
Ответ: ZXY
https://inf-ege.sdamgia.ru/test?theme=353
В немонотонных функциях логическое выражение F может принимать значение как true (1), так и false (0)
https://inf-ege.sdamgia.ru/problem?id=9353
Логическая функция F задаётся выражением (¬z)∧x ∨ x∧y. Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных x, y, z.
Перем. 1 | Перем. 2 | Перем. 3 | Функция |
---|---|---|---|
??? | ??? | ??? | F |
0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 |
0 | 1 | 0 | 0 |
0 | 1 | 1 | 1 |
1 | 0 | 0 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 0 |
1 | 1 | 1 | 1 |
В ответе напишите буквы x, y, z в том порядке, в котором идут соответствующие им столбцы (сначала – буква, соответствующая 1-му столбцу; затем – буква, соответствующая 2-му столбцу; затем – буква, соответствующая 3-му столбцу). Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно. Пример. Пусть задано выражение x → y, зависящее от двух переменных x и y, и таблица истинности:
Перем. 1 | Перем. 2 | Функция |
---|---|---|
??? | ??? | F |
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 1 |
1 | 1 | 1 |
Тогда 1-му столбцу соответствует переменная y, а 2-му столбцу соответствует переменная x. В ответе нужно написать: yx.
from itertools import product
foo = list(product([0,1], repeat=3))
g = lambda x: 1 if x else 0
f = lambda x, y, z: g((not z and x) or (x and y))
for bar in foo:
print(bar, f(*bar))
(0, 0, 0) 0 (0, 0, 1) 0 (0, 1, 0) 0 (0, 1, 1) 0 (1, 0, 0) 1 (1, 0, 1) 0 (1, 1, 0) 1 (1, 1, 1) 1
# меняем x и z местами
f = lambda z, y, x: g((not z and x) or (x and y))
for bar in foo:
print(bar, f(*bar))
(0, 0, 0) 0 (0, 0, 1) 1 (0, 1, 0) 0 (0, 1, 1) 1 (1, 0, 0) 0 (1, 0, 1) 0 (1, 1, 0) 0 (1, 1, 1) 1
Ответ: ZYX
https://inf-ege.sdamgia.ru/test?theme=352
Строки с пропущенными значениями - это когда в исходной матрице задачи некоторые ячейки оставлены пустыми. Это значит, что в пустой ячейке может стоять как ноль, так и единица. По сути это задача с неполными данными, что привносит в процесс рассуждений неопределенность. К счастью, подавляющее большинство таких задач - это задачи на монотонную функцию, что делает их все же решаемыми. Если бы это были задачи с немонотонной функцией - то решить такие задачи было бы или сложно, или практически невозожно
https://inf-ege.sdamgia.ru/problem?id=15787
Логическая функция F задаётся выражением ((x → y ) ∧ (y → w)) ∨ (z ≡ ( x ∨ y)).
Дан частично заполненный фрагмент, содержащий неповторяющиеся строки таблицы истинности функции F.
Определите, какому столбцу таблицы истинности соответствует каждая из переменных x, y, z, w.
Переменная 1 | Переменная 2 | Переменная 3 | Переменная 4 | Функция |
---|---|---|---|---|
??? | ??? | ??? | ??? | F |
1 | 1 | 0 | ||
1 | 0 | |||
1 | 1 | 0 |
В ответе напишите буквы x, y, z, w в том порядке, в котором идут соответствующие им столбцы (сначала — буква, соответствующая первому столбцу; затем — буква, соответствующая второму столбцу, и т. д.). Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
Пример. Пусть задано выражение x → y, зависящее от двух переменных x и y, и фрагмент таблицы истинности:
Переменная 1 | Переменная 2 | Функция |
---|---|---|
??? | ??? | F |
0 | 1 | 0 |
Тогда первому столбцу соответствует переменная y, а второму столбцу соответствует переменная x. В ответе нужно написать: yx.
from itertools import product
foo = list(product([0,1], repeat=4))
g = lambda x: 1 if x else 0
f = lambda x, y, z, w: g(((y or not x) and (w or not y)) or (z == (x or y)))
for bar in foo:
if f(*bar) == 0:
print(bar, f(*bar))
(0, 1, 0, 0) 0 (1, 0, 0, 0) 0 (1, 0, 0, 1) 0 (1, 1, 0, 0) 0
Здесь сложность в том, что на выходе мы получаем 4 строки, а не 3 строки. Приходится действовать методом подбора.
Здесь лишь в 3-й и 4-й строках представлены по две единицы. Они будут для нас ориентирами, см. также с исходной матрицей.
Начнем эксперимент с 3-й строки. Попробуем выйти на нужный результат, поменяв местами x и y:
# меняем x и y
f = lambda y, x, z, w: g(((y or not x) and (w or not y)) or (z == (x or y)))
for bar in foo:
if f(*bar) == 0:
print(bar, f(*bar))
(0, 1, 0, 0) 0 (0, 1, 0, 1) 0 (1, 0, 0, 0) 0 (1, 1, 0, 0) 0
# меняем местами x и w
f = lambda y, w, z, x: g(((y or not x) and (w or not y)) or (z == (x or y)))
for bar in foo:
if f(*bar) == 0:
print(bar, f(*bar))
(0, 0, 0, 1) 0 (0, 1, 0, 1) 0 (1, 0, 0, 0) 0 (1, 0, 0, 1) 0
Ответ: YWZX