Две логические функции заданы выражениями:
Дан частично заполненный фрагмент, содержащий неповторяющиеся строки таблицы истинности обеих функций.
Определите, какому столбцу таблицы истинности соответствует каждая из переменных w, x, y, z.
??? | ??? | ??? | ??? | F1 | F2 |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 0 | |
| 0 | 1 | 0 | 1 | ||
| 0 | 0 | 0 | 0 |
В ответе напишите буквы w, x, y, z в том порядке, в котором идут соответствующие им столбцы (сначала буква, соответствующая первому столбцу; затем буква, соответствующая второму столбцу, и т. д.). Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
Пример. Пусть задано выражение x → y, зависящее от двух переменных x и y, и фрагмент таблицы истинности для одной функции:
| Переменная 1 ??? | Переменная 2 ??? | Функция F |
|---|---|---|
| 0 | 1 | 0 |
Тогда первому столбцу соответствует переменная y, а второму столбцу соответствует переменная x. В ответе нужно написать: yx.
Составим таблицу истинности для исходных выражений при помощи языка Python:
| x | y | z | w | f1 | f2 |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 1 | 1 |
| 0 | 0 | 0 | 1 | 0 | 0 |
| 0 | 0 | 1 | 0 | 1 | 0 |
| 0 | 0 | 1 | 1 | 1 | 1 |
| 0 | 1 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 0 | 0 | 0 |
| 0 | 1 | 1 | 1 | 0 | 1 |
| 1 | 0 | 0 | 0 | 0 | 1 |
| 1 | 0 | 0 | 1 | 0 | 1 |
| 1 | 0 | 1 | 0 | 0 | 1 |
| 1 | 0 | 1 | 1 | 0 | 1 |
| 1 | 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 0 | 1 | 0 | 0 |
| 1 | 1 | 1 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 | 1 | 1 |
def f_1(x, y, z, w):
if ((x == y) and (w <= z )) == 1:
return 1
else:
return 0
def f_2(x, y, z, w):
if ((x <= y) <= (w == z)) == 1:
return 1
else:
return 0
print('x y z w f1 f2')
for x in range(2):
for y in range(2):
for z in range(2):
for w in range(2):
print(x, y, z, w, ' ', f_1(x, y, z, w), ' ',f_2(x, y, z, w))
Мы получили 16 наборов.
Рассмотрим первую строку таблицы, в ней значение первой функции равно 1, а значение второй — 0, при этом три переменные принимают значение 1. Это возможно только в одном случае (1, 1, 1, 0), то есть w соответствует второй столбец.
Рассмотрим третью строку таблицы, в ней значение первой функции равно 0, и значение второй — 0, при этом переменная w принимает значение 0. Это возможно только в одном случае (0, 1, 1, 0), то есть x соответствует третий столбец.
Теперь найдем случай, при котором первая функция принимает значение 1, w принимает значение 1, x принимает значение 0. Это возможно только в одном случае (0, 0, 1, 1), то есть y соответствует первый столбец, а z соответствует четвёртый столбец.
Ответ: ywxz.
Приведём решение Юрия Красильникова на языке Python.
import itertools,fnmatch
def perm(s,p):
return ''.join([s[ndx] for ndx in p])+s[len(p):]
def f(vars):
x,y,z,w = vars
f1 = (x==y) and (not w or z)
f2 = not (not x or y) or (w == z)
return ''.join(map(str,vars)) + str(int(f1)) + str(int(f2))
matrix = ['1?1110', '010?1?', '?00?00']
numvars = 4
numlines = len(matrix)
table = [f(vars) for vars in itertools.product((0,1), repeat=numvars)]
for p in itertools.permutations(range(numvars)):
permtable = [perm(line,p) for line in table]
for lines in itertools.permutations(permtable,numlines):
if fnmatch.fnmatch(''.join(lines),''.join(matrix)):
print(perm('xyzw',p))

