Две логические функции заданы выражениями:
Дан частично заполненный фрагмент, содержащий неповторяющиеся строки таблицы истинности обеих функций.
Определите, какому столбцу таблицы истинности соответствует каждая из переменных w, x, y, z.
| ??? | ??? | ??? | ??? | F1 | F2 |
|---|---|---|---|---|---|
| 1 | 0 | 1 | 0 | ||
| 0 | 0 | 0 | 0 | ||
| 0 | 0 | 0 | 0 | 1 |
В ответе напишите буквы x, y, z, w в том порядке, в котором идут соответствующие им столбцы (сначала — буква, соответствующая первому столбцу; затем — буква, соответствующая второму столбцу, и т. д.). Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
Пример. Пусть задано выражение x → y, зависящее от двух переменных x и y, и фрагмент таблицы истинности:
| Переменная 1 | Переменная 2 | Функция |
|---|---|---|
| ??? | ??? | F |
| 0 | 1 | 0 |
Тогда первому столбцу соответствует переменная y, а второму столбцу соответствует переменная x. В ответе нужно написать: yx.
Составим таблицу истинности для исходных выражений при помощи языка Python:
def f_1(x, y, z, w):
if ((x <= y) == (w or not(z))) == 1:
return 1
else:
return 0
def f_2(x, y, z, w):
if ((x <= y) and (not(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 наборов. Рассмотрим последнюю строку таблицы, в ней значение первой функции равно 0, а значение второй — 1, при этом три переменные принимают значение 0. Это возможно только в одном случае (0, 0, 1, 0), то есть z соответствует второй столбец.
Теперь найдем случай, при котором первая функция принимает значение 0, z принимает значение 0 и ещё две переменные принимают значение 0. Это возможно только в одном случае (1, 0, 0, 0), то есть x соответствует первый столбец.
Теперь найдем случай, при котором вторая функция принимает значение 0, x принимает любое значение, z принимает значение 1, одна функция принимает значение 0, и ещё одна принимает значение 1. Возможны два случая: (0, 0, 1, 1), и (1, 0, 1, 1). В обоих из них y принимает значение 0, а w — значение 1.
Таким образом, x соответствует первый столбец, z — второй, y — третий, w — четвертый.
Ответ: xzyw.
Вариант программы Олега Морозова на языка Python:
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):
f1 = ((x <= y) == (w or not z))
f2 = ((x <= y) and (not w == z))
print(x, y, z, w, " ", int(f1), " ", int(f2))
Решение Юрия Красильникова на языка 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 = (not x or y) == (w or not z)
f2 = (not x or y) and (w != z)
return str(int(f1)) + str(int(f2))
matrix = ['?101?0', '?0000?', '0?0001']
numvars = 4
numlines = len(matrix)
table = [''.join(map(str,vars)) + 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))
#Ответ xzyw печатается дважды.
#Это значит, что одна из строк таблицы в условии может соответствовать двум строкам в полной таблице истинности.

