psilogic: (Default)
psilogic ([personal profile] psilogic) wrote2006-04-23 12:03 pm

Ловушка для логиков ;)

Если какой-нибудь ваш знакомый/знакомая будет хвастаться тем, что хорошо знает математическую логику, можете приколоться над ним/ней, дав одну задачку. Велики шансы, что он/она на ней засыпется, несмотря на простоту.

Есть фраза: "я либо пойду сегодня в кино, либо в гости к родителям, либо в боулинг".
Как логическими операциями связать три варианта действий:
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 и более - ничего подходящего.

[identity profile] batva.livejournal.com 2006-04-23 08:30 am (UTC)(link)
до первой скобочки я додумался, а дальше... правда я не учил логику

[identity profile] ex-kpblca248.livejournal.com 2006-04-23 08:38 am (UTC)(link)
(A xor B) xor C

[identity profile] psilogic.livejournal.com 2006-04-23 08:54 am (UTC)(link)
подставьте A=B=C=true :)

[identity profile] ex-kpblca248.livejournal.com 2006-04-23 08:59 am (UTC)(link)
в этом случае остаётся С

[identity profile] psilogic.livejournal.com 2006-04-23 09:03 am (UTC)(link)
что не есть правильно, т.к. фраза не сводится к "я пойду в боулинг"

[identity profile] ex-kpblca248.livejournal.com 2006-04-23 09:10 am (UTC)(link)
Не сводится, но выбор осуществлён.
Вы подумайте просто.

[identity profile] phantomer.livejournal.com 2006-04-23 11:57 am (UTC)(link)
(A xor B xor C) and not (A and B and C)

Это работает, но только для трёх аргументов, а масштабирования не получается. Для четырёх аргументов формула

(A xor B xor C xor D) and not (A and B and C and D)

не пашет, ибо для t,t,t,f она даст t, что неверно. Похоже, ДНФ самое универсальное, никуда не спрячешься, кругом ахтунг.

[identity profile] psilogic.livejournal.com 2006-04-23 12:43 pm (UTC)(link)
ага, для четырех громоздко получается

[identity profile] ex-kpblca248.livejournal.com 2006-04-23 06:52 pm (UTC)(link)
(A xor B xor C) and not (A and B and C) не работает, потому что в случае трёх истин выбора не происходит и решение зависает.

[identity profile] psilogic.livejournal.com 2006-04-23 07:13 pm (UTC)(link)
выбор тут ни при чем, не несите ерунду, если не понимаете, о чем идет речь

[identity profile] ex-kpblca248.livejournal.com 2006-04-23 07:33 pm (UTC)(link)
Я не несу.
Какое у Вас решение будет при трёх истинах? Вы никуда не пойдёте получается?
У Вас условие задачи не соответствует решению.

[identity profile] psilogic.livejournal.com 2006-04-23 07:41 pm (UTC)(link)
Я не несу.

несете :)

Какое у Вас решение будет при трёх истинах? Вы никуда не пойдёте получается?

При трех истинах я пойду во все три места.

[identity profile] ex-kpblca248.livejournal.com 2006-04-23 07:47 pm (UTC)(link)
>При трех истинах я пойду во все три места

Это ошибка.
Избыточное "not (A and B and C)" в этом случае даёт false, и "and" превращает всё решение тоже в false
Таким образом выбирающий никуда не идёт.

Алгоритм такой
Я иду в А
Иначе иду в В
Иначе иду в С

Но в условии задачи нет того, что я никуда не иду, то есть
Иначе никуда.


[identity profile] psilogic.livejournal.com 2006-04-23 08:02 pm (UTC)(link)
Избыточное "not (A and B and C)" в этом случае даёт false, и "and" превращает всё решение тоже в false

Так и должно быть. По условию я не иду во все три места одновременно, я иду только в одно из трех. Три "true" соответствуют утверждению, что я иду во все три места одновременно. То есть, ложному высказыванию. Результат формулы соответствует ложности высказывания.

Другими словами, формула должна давать на выходе true, когда только одно из высказываний A, B, C true, а два других - false. Во всех остальных случаях формула должна давать false. В том числе и когда все три высказывания true, на выходе должно быть false. Понятно?

[identity profile] ex-kpblca248.livejournal.com 2006-04-23 08:05 pm (UTC)(link)
Вы не учитываете, что человек не может пойти и в два места одновременно (как и в три).

Мне кажется нужно добавить в условие, что выбирающий не может пойти в два и в три места одновременно (что очевидно) и есть возможность никуда не пойти, тогда
(A xor B xor C) and not (A xor B xor C)

[identity profile] ex-kpblca248.livejournal.com 2006-04-23 08:15 pm (UTC)(link)
А ещё вернее получается совсем не красиво
(A xor B xor C) and ((A + B + C) <= 1)

[identity profile] psilogic.livejournal.com 2006-04-23 08:29 pm (UTC)(link)
Операция "+" по условию не предусматривалась :) Да и нет в природе такой операции "+", как вы нарисовали. Интуитивно понятно, что вы имели в виду, но тогда можно проще: A + B + C = 1.

[identity profile] ex-kpblca248.livejournal.com 2006-04-23 08:31 pm (UTC)(link)
Да-да, простите.

[identity profile] psilogic.livejournal.com 2006-04-23 08:26 pm (UTC)(link)
Вы не учитываете, что человек не может пойти и в два места одновременно (как и в три).

Учитываю. Может. Перечитайте условие. По условию человек утверждает, что пойдет только в одно. Надо выразить истинность его слов формулой.

(A xor B xor C) and not (A xor B xor C)

Эта формула даст false при любых знгачениях переменных.

[identity profile] ex-kpblca248.livejournal.com 2006-04-23 08:30 pm (UTC)(link)
Всё, поняла. Вы правы.
Я не с той стороны зашла и все мои примеры действительно дурацкие.

[identity profile] psilogic.livejournal.com 2006-04-23 08:34 pm (UTC)(link)
А я думал, вы надо мной прикалываетесь :) Не расстраивайтесь :)

[identity profile] ex-kpblca248.livejournal.com 2006-04-23 08:37 pm (UTC)(link)
Я не расстраиваюсь. Я поняла, что Вы смотрите с точки зрения машины. Я же как простая выбирающая - нелинейно.

[identity profile] psilogic.livejournal.com 2006-04-23 08:47 pm (UTC)(link)
машины тут ни при чем, это логика еще времен Аристотеля :)

[identity profile] ex-kpblca248.livejournal.com 2006-04-23 09:04 pm (UTC)(link)
Я думаю, что логика существовала и раньше Аристотеля, как и Америка до её открывателей.

"Машинная" - в смысле с целью выразить формулой, годной для машинных вычислений. (Вы это сразу сказали в условии, можете не напоминать)
Можно и дальше придираться к этому слову, но, думаю, Вы не станете.

[identity profile] ex-kpblca248.livejournal.com 2006-04-23 09:32 pm (UTC)(link)
Знаете, я что подумала ещё - это не относится к задаче, а скорее к тому, что меня сбило с толку.
Например, есть два условия:
А = "пойти в кино"
В = "пойти в гости"
возникает вопрос, что тогда значит "true"? Сам процесс "идти", т.е. "да, пойду"?
Например, (A xor B) даёт:
1. "true", т.е. "пойду", а куда не известно.
2. А или В, т.е. "пойду в кино" или "пойду в гости", но эти два значения не равны и не могут быть одновременно "true"
Надеюсь, объяснила :)
Если нет, не ругайтесь, просто мысль.

[identity profile] phantomer.livejournal.com 2006-04-24 03:41 am (UTC)(link)
"Выбора не происходит" это реально новое слово в науке. :-))

[identity profile] ex-kpblca248.livejournal.com 2006-04-24 06:43 am (UTC)(link)
Оперировать небулевыми значениями булевыми операциями - тоже весьма оригинально.

[identity profile] nomatrix.livejournal.com 2006-04-23 04:29 pm (UTC)(link)
я так понял, требуется формула, равная истине тогда, когда истине равна только одна из переменных.
Может, это подойдет?
(A XOR B XOR C) AND (A OR B XOR C)
Сэкономил одну операцию.

[identity profile] psilogic.livejournal.com 2006-04-23 07:07 pm (UTC)(link)
если все три операнда true, то по этой формуле получится true

[identity profile] nomatrix.livejournal.com 2006-04-23 07:21 pm (UTC)(link)
я-то думал, то, что правее AND, не выполняется при A=B=C=true:
A OR B XOR C = true OR true XOR true = (true OR true) XOR true = true XOR true = false

[identity profile] psilogic.livejournal.com 2006-04-23 07:25 pm (UTC)(link)
Нет, все выполняется. В C++ есть оптимизация, но она не влияет на булевский результат, а только н апобочные эффекты вызова функций и выглядит по-другому:
false and ... = false, правее не выполняется
true or ... = true, правее не выполняется

[identity profile] nomatrix.livejournal.com 2006-04-23 07:52 pm (UTC)(link)
Шаблону true or ... = true соответствовало бы такое выражение:
true OR (true XOR true)
Но поскольку Вы сами писали однажды, что
Операции одного приоритета выполняются слева направо,
скобки по умолчанию ставятся вокруг операндов самой левой операции OR, т.е.
(true OR true) XOR true.
Да, оптимизатор скажет, что выражение под скобками равно true. Но ведь потом этому true сделают XOR с еще одним true, и в результате получистя false?
Или я пропустил какой-то важный момент в Вашем учебнике?

[identity profile] psilogic.livejournal.com 2006-04-23 08:06 pm (UTC)(link)
Конечно, при необходимости то, что на месте многоточия, надо заключать в скобки, чтобы сохранить порядок действий.

блин

[identity profile] tbapb-xl.livejournal.com 2006-04-23 08:24 pm (UTC)(link)
благодаря вам узнал, что забыл что такое xor :))

Re: блин

[identity profile] psilogic.livejournal.com 2006-04-23 08:34 pm (UTC)(link)
:))))

[identity profile] q-styler.livejournal.com 2006-05-04 06:29 pm (UTC)(link)
если упростить первую фразу, то получается третья

[identity profile] aimant-la-vie.livejournal.com 2006-05-11 02:38 pm (UTC)(link)
почитал все эти комменты и осознал, что я, видимо, простак, так как составил ДНФ и не парился.
Уж даже не знаю, что длиннее - ДНФ или попытки сделать вариант с XOR правильным для любого числа аргументов. Кстати, если речь идет о программировании, грош цена такому неуниверсальному, частному решению.
А ДНФ можно попробовать преобразовать по правилам мат.логики до наиболее короткого результата. Только вот начинать-то все равно с ДНФ надо, я думаю.

[identity profile] psilogic.livejournal.com 2006-05-11 03:13 pm (UTC)(link)
А ДНФ можно попробовать преобразовать по правилам мат.логики до наиболее короткого результата.

В ЭТОМ случае ДНФ для любого числа аргументов сократить не получится. Т.е. ДНФ тут единственная (с точностью до перестановки операндов) и сокращению не поддается.

[identity profile] mamakarlo.livejournal.com 2006-05-17 02:10 pm (UTC)(link)
Вы знаете, я ни черта не понимаю в логике. Точнее, скажем так, я от формул устаю быстро =) Только при большой необходимости стану вникать во все эти операнты и расписанные Вами уравнения.
Но я вижу одну большую ошибку, которая почему-то никак не повлияла на ход Ваших рассуждений. Честно говоря, сначала я была уверена, что в ней и состоит прикол, мешающий логике.

либо пойду сегодня в кино, либо в гости к родителям, либо в боулинг"

Нельзя сопоставлять "пойду" и "в гости". Надеюсь, подробно объяснять нет необходимости =)

[identity profile] 2macy.livejournal.com 2006-05-27 09:23 pm (UTC)(link)
А мне в четверг сдавать логику .. у меня есть несколько дней чтобы научится решать подобные задачи ..рисовать круги Эйлера .. и еще что-то там …

Тяжко будет мне .. :) хотя и не так сложно как тут ..

[identity profile] psilogic.livejournal.com 2006-05-28 03:47 pm (UTC)(link)
да вроде несложно там :)

[identity profile] 2macy.livejournal.com 2006-05-28 04:04 pm (UTC)(link)
ну это кому как .. :)

[identity profile] mr-ri.livejournal.com 2006-05-31 10:30 am (UTC)(link)
Ладно пробую, пусть есть N условий либо-либо.

f(n) = (!(g(n-1) && n)) && (n xor f(n-1))

g(k) = 1 || 2 || .. || k

f(1) = 1

Вроде как-то так..