Ловушка для логиков ;)
Apr. 23rd, 2006 12:03 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Если какой-нибудь ваш знакомый/знакомая будет хвастаться тем, что хорошо знает математическую логику, можете приколоться над ним/ней, дав одну задачку. Велики шансы, что он/она на ней засыпется, несмотря на простоту.
Есть фраза: "я либо пойду сегодня в кино, либо в гости к родителям, либо в боулинг".
Как логическими операциями связать три варианта действий:
A = "я пойду сегодня в кино"
B = "я пойду сегодня в гости к родителям"
C = "я пойду сегодня в боулинг"
?
Допускается применять операции or, xor, and, not. Формула должна быть по-короче.
Простаки, которые реально учили логику, начнут составлять дизъюнктивную нормальную форму. Примерно так:
[ A and (not B) and (not C) ] or [ (not A) and B and (not C) ] or [ (not A) and (not B) and C ]
Это правильно, но длинно.
Те, кто по-хитрее, заметят операцию "xor". И напишут:
A xor B xor C
И тут то вы их обломаете :) По смыслу фразы нельзя пойти сразу во все три места. Однако, если подставить три раза true, то получим:
A xor B xor C = true xor true xor true = false xor true = true
А должно быть false, т.к. не пойдет чел сразу в три места.
Вот правильная и сравнительно короткая запись:
(A xor B xor C) and not (A and B and C)
- т.е. три "xor"-a и исключаем "плохой" случай, когда все true.
Интересно, можно ли написать еще короче?
Кстати, получается, что для довольно обычной конструкции "... либо ... либо ..." - когда союз "либо" соединяет три и более условия, нет логической операции. Для двух работает A xor B, а для 3, 4 и более - ничего подходящего.
Есть фраза: "я либо пойду сегодня в кино, либо в гости к родителям, либо в боулинг".
Как логическими операциями связать три варианта действий:
A = "я пойду сегодня в кино"
B = "я пойду сегодня в гости к родителям"
C = "я пойду сегодня в боулинг"
?
Допускается применять операции or, xor, and, not. Формула должна быть по-короче.
Простаки, которые реально учили логику, начнут составлять дизъюнктивную нормальную форму. Примерно так:
[ A and (not B) and (not C) ] or [ (not A) and B and (not C) ] or [ (not A) and (not B) and C ]
Это правильно, но длинно.
Те, кто по-хитрее, заметят операцию "xor". И напишут:
A xor B xor C
И тут то вы их обломаете :) По смыслу фразы нельзя пойти сразу во все три места. Однако, если подставить три раза true, то получим:
A xor B xor C = true xor true xor true = false xor true = true
А должно быть false, т.к. не пойдет чел сразу в три места.
Вот правильная и сравнительно короткая запись:
(A xor B xor C) and not (A and B and C)
- т.е. три "xor"-a и исключаем "плохой" случай, когда все true.
Интересно, можно ли написать еще короче?
Кстати, получается, что для довольно обычной конструкции "... либо ... либо ..." - когда союз "либо" соединяет три и более условия, нет логической операции. Для двух работает A xor B, а для 3, 4 и более - ничего подходящего.
no subject
Date: 2006-04-23 08:30 am (UTC)no subject
Date: 2006-04-23 08:38 am (UTC)no subject
Date: 2006-04-23 08:54 am (UTC)no subject
Date: 2006-04-23 08:59 am (UTC)no subject
Date: 2006-04-23 09:03 am (UTC)no subject
Date: 2006-04-23 09:10 am (UTC)Вы подумайте просто.
no subject
Date: 2006-04-23 11:57 am (UTC)Это работает, но только для трёх аргументов, а масштабирования не получается. Для четырёх аргументов формула
(A xor B xor C xor D) and not (A and B and C and D)
не пашет, ибо для t,t,t,f она даст t, что неверно. Похоже, ДНФ самое универсальное, никуда не спрячешься
, кругом ахтунг.no subject
Date: 2006-04-23 12:43 pm (UTC)no subject
Date: 2006-04-23 06:52 pm (UTC)no subject
Date: 2006-04-23 07:13 pm (UTC)no subject
Date: 2006-04-23 07:33 pm (UTC)Какое у Вас решение будет при трёх истинах? Вы никуда не пойдёте получается?
У Вас условие задачи не соответствует решению.
no subject
Date: 2006-04-23 07:41 pm (UTC)несете :)
Какое у Вас решение будет при трёх истинах? Вы никуда не пойдёте получается?
При трех истинах я пойду во все три места.
no subject
Date: 2006-04-23 07:47 pm (UTC)Это ошибка.
Избыточное "not (A and B and C)" в этом случае даёт false, и "and" превращает всё решение тоже в false
Таким образом выбирающий никуда не идёт.
Алгоритм такой
Я иду в А
Иначе иду в В
Иначе иду в С
Но в условии задачи нет того, что я никуда не иду, то есть
Иначе никуда.
no subject
Date: 2006-04-23 08:02 pm (UTC)Так и должно быть. По условию я не иду во все три места одновременно, я иду только в одно из трех. Три "true" соответствуют утверждению, что я иду во все три места одновременно. То есть, ложному высказыванию. Результат формулы соответствует ложности высказывания.
Другими словами, формула должна давать на выходе true, когда только одно из высказываний A, B, C true, а два других - false. Во всех остальных случаях формула должна давать false. В том числе и когда все три высказывания true, на выходе должно быть false. Понятно?
no subject
Date: 2006-04-23 08:05 pm (UTC)Мне кажется нужно добавить в условие, что выбирающий не может пойти в два и в три места одновременно (что очевидно) и есть возможность никуда не пойти, тогда
(A xor B xor C) and not (A xor B xor C)
no subject
Date: 2006-04-23 08:15 pm (UTC)(A xor B xor C) and ((A + B + C) <= 1)
no subject
Date: 2006-04-23 08:29 pm (UTC)no subject
Date: 2006-04-23 08:31 pm (UTC)no subject
Date: 2006-04-23 08:26 pm (UTC)Учитываю. Может. Перечитайте условие. По условию человек утверждает, что пойдет только в одно. Надо выразить истинность его слов формулой.
(A xor B xor C) and not (A xor B xor C)
Эта формула даст false при любых знгачениях переменных.
no subject
Date: 2006-04-23 08:30 pm (UTC)Я не с той стороны зашла и все мои примеры действительно дурацкие.
no subject
Date: 2006-04-23 08:34 pm (UTC)no subject
Date: 2006-04-23 08:37 pm (UTC)no subject
Date: 2006-04-23 08:47 pm (UTC)no subject
Date: 2006-04-23 09:04 pm (UTC)"Машинная" - в смысле с целью выразить формулой, годной для машинных вычислений. (Вы это сразу сказали в условии, можете не напоминать)
Можно и дальше придираться к этому слову, но, думаю, Вы не станете.
no subject
Date: 2006-04-23 09:32 pm (UTC)Например, есть два условия:
А = "пойти в кино"
В = "пойти в гости"
возникает вопрос, что тогда значит "true"? Сам процесс "идти", т.е. "да, пойду"?
Например, (A xor B) даёт:
1. "true", т.е. "пойду", а куда не известно.
2. А или В, т.е. "пойду в кино" или "пойду в гости", но эти два значения не равны и не могут быть одновременно "true"
Надеюсь, объяснила :)
Если нет, не ругайтесь, просто мысль.
no subject
Date: 2006-04-24 03:41 am (UTC)no subject
Date: 2006-04-24 06:43 am (UTC)no subject
Date: 2006-04-23 04:29 pm (UTC)Может, это подойдет?
(A XOR B XOR C) AND (A OR B XOR C)
Сэкономил одну операцию.
no subject
Date: 2006-04-23 07:07 pm (UTC)no subject
Date: 2006-04-23 07:21 pm (UTC)A OR B XOR C = true OR true XOR true = (true OR true) XOR true = true XOR true = false
no subject
Date: 2006-04-23 07:25 pm (UTC)false and ... = false, правее не выполняется
true or ... = true, правее не выполняется
no subject
Date: 2006-04-23 07:52 pm (UTC)true OR (true XOR true)
Но поскольку Вы сами писали однажды, что
Операции одного приоритета выполняются слева направо,
скобки по умолчанию ставятся вокруг операндов самой левой операции OR, т.е.
(true OR true) XOR true.
Да, оптимизатор скажет, что выражение под скобками равно true. Но ведь потом этому true сделают XOR с еще одним true, и в результате получистя false?
Или я пропустил какой-то важный момент в Вашем учебнике?
no subject
Date: 2006-04-23 08:06 pm (UTC)блин
Date: 2006-04-23 08:24 pm (UTC)Re: блин
Date: 2006-04-23 08:34 pm (UTC)no subject
Date: 2006-05-04 06:29 pm (UTC)no subject
Date: 2006-05-11 02:38 pm (UTC)Уж даже не знаю, что длиннее - ДНФ или попытки сделать вариант с XOR правильным для любого числа аргументов. Кстати, если речь идет о программировании, грош цена такому неуниверсальному, частному решению.
А ДНФ можно попробовать преобразовать по правилам мат.логики до наиболее короткого результата. Только вот начинать-то все равно с ДНФ надо, я думаю.
no subject
Date: 2006-05-11 03:13 pm (UTC)В ЭТОМ случае ДНФ для любого числа аргументов сократить не получится. Т.е. ДНФ тут единственная (с точностью до перестановки операндов) и сокращению не поддается.
no subject
Date: 2006-05-17 02:10 pm (UTC)Но я вижу одну большую ошибку, которая почему-то никак не повлияла на ход Ваших рассуждений. Честно говоря, сначала я была уверена, что в ней и состоит прикол, мешающий логике.
"Я либо пойду сегодня в кино, либо в гости к родителям, либо в боулинг"
Нельзя сопоставлять "пойду" и "в гости". Надеюсь, подробно объяснять нет необходимости =)
no subject
Date: 2006-05-27 09:23 pm (UTC)Тяжко будет мне .. :) хотя и не так сложно как тут ..
no subject
Date: 2006-05-28 03:47 pm (UTC)no subject
Date: 2006-05-28 04:04 pm (UTC)no subject
Date: 2006-05-31 10:30 am (UTC)f(n) = (!(g(n-1) && n)) && (n xor f(n-1))
g(k) = 1 || 2 || .. || k
f(1) = 1
Вроде как-то так..