Задания
Версия для печати и копирования в MS Word
Тип 2 № 55589
i

Две ло­ги­че­ские функ­ции за­да­ны вы­ра­же­ни­я­ми:

F1  =  (x → y)≡(w ∨ ¬ z),

F2  =  (x → y)∧(¬wz).

Дан ча­стич­но за­пол­нен­ный фраг­мент, со­дер­жа­щий не­по­вто­ря­ю­щи­е­ся стро­ки таб­ли­цы ис­тин­но­сти обеих функ­ций.

Опре­де­ли­те, ка­ко­му столб­цу таб­ли­цы ис­тин­но­сти со­от­вет­ству­ет каж­дая из пе­ре­мен­ных w, x, y, z.

 

????????? ??? F1

F2

1010
0000
00001

 

В от­ве­те на­пи­ши­те буквы x, y, z, w в том по­ряд­ке, в ко­то­ром идут со­от­вет­ству­ю­щие им столб­цы (сна­ча­ла  — буква, со­от­вет­ству­ю­щая пер­во­му столб­цу; затем  — буква, со­от­вет­ству­ю­щая вто­ро­му столб­цу, и т. д.). Буквы в от­ве­те пи­ши­те под­ряд, ни­ка­ких раз­де­ли­те­лей между бук­ва­ми ста­вить не нужно.

 

При­мер. Пусть за­да­но вы­ра­же­ние xy, за­ви­ся­щее от двух пе­ре­мен­ных x и y, и фраг­мент таб­ли­цы ис­тин­но­сти:

 

Пе­ре­мен­ная 1Пе­ре­мен­ная 2Функ­ция
??????F
010

 

Тогда пер­во­му столб­цу со­от­вет­ству­ет пе­ре­мен­ная 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 пе­ча­та­ет­ся два­жды.

#Это зна­чит, что одна из строк таб­ли­цы в усло­вии может со­от­вет­ство­вать двум стро­кам в пол­ной таб­ли­це ис­тин­но­сти.


Аналоги к заданию № 55589: 55619 Все