ahaxopet: (Default)
[personal profile] ahaxopet
Как говорит Авва, этот пост может быть интересен только математикам или программистам. Да и то не всем. :-)

На работе для некоего языка запросов мне потребовалось обобщить стандартные логические операции and и or на произвольное количество аргументов, примерно как в лиспе. Определим функцию and, которая принимает список логических значений и возвращает истину, если все эти значения истинны. Попробуйте ответить быстро, не задумываясь - что должна вернуть эта функция, если ей передать пустой список? А функция or? Потом подумайте немного и ответьте еще раз.

А теперь настоящий вопрос - почему многие навскидку отвечают неправильно? Проверил на коллегах, из пяти только один сразу дал правильный ответ, да и тот лисп знает, так что это не считается.

Date: 2009-03-04 01:24 pm (UTC)
From: [identity profile] alexott.livejournal.com
true & false ;-)

Date: 2009-03-04 01:25 pm (UTC)
From: [identity profile] rev-andre.livejournal.com
Думаю, пустой список "и" будет интерпретировать как "1", а "или" как "0". Но это чисто подумав про Лисп :)

Date: 2009-03-04 01:50 pm (UTC)
From: [identity profile] irene221b.livejournal.com
and - true, or - false.

Но что-то "навскидку" не получилось, я представила рекурсию еще по ходу чтения. :-)

Получается наоборот, видимо, от ощущения что and - суровее. :-)

Date: 2009-03-04 02:14 pm (UTC)
From: [identity profile] http://users.livejournal.com/_cbeta_/
Я вот до сих пор не понимаю, почему так, хотя Дима мне один раз уже рассказывал :)

Date: 2009-03-04 02:34 pm (UTC)
From: [identity profile] flaass.livejournal.com
Просто, каждый раз к предыдущему результату по одному и тому же правилу добавляется следующий аргумент. Если правило "и", то начинать с нуля бессмысленно - всегда будет получаться 0. Аналогично для "или" и 1.

А почему "многие неправильно" - по психологическим причинам. Навскидку вероятность 1/2, но лучше запоминаются случаи, когда отвечающий ошибся :)

Date: 2009-03-04 03:26 pm (UTC)
From: [identity profile] http://users.livejournal.com/_cbeta_/
Да, я ж говорю, что уже поняла :)

Date: 2009-03-04 02:15 pm (UTC)
From: [identity profile] http://users.livejournal.com/_cbeta_/
Нет, со словом "рекурсия" уже понимаю :)

Date: 2009-03-04 02:37 pm (UTC)
avysk: (Default)
From: [personal profile] avysk
Истина для and, ложь для or, навскидку. Потому что единица -- нейтральный элемент по умножению.
From: [identity profile] igorm.livejournal.com
Функции должны выбрасывать exception.
From: [identity profile] ahaxopet.livejournal.com
Зачем выбрасывать exception, когда можно вернуть осмысленное значение?
From: [identity profile] irene221b.livejournal.com
А чего сразу exception? Это, фактически, умножение на ноль и сложение с нулем. Зачем их выбрасывать?

Пустой массив

Date: 2009-03-06 09:03 am (UTC)
From: [identity profile] igorm.livejournal.com
это аномалия, а вы действуете как будто так и должно быть.

Date: 2009-03-04 08:48 pm (UTC)
From: [identity profile] just-developer.livejournal.com
А с какой радости спецификация (то что должны возвращать операторы) зависит от "удобности" реализации?
Должно быть соглашение для пустого списка значений - лучше - из предметной области.
Судя по всему - exception.

IllegalArgumentException ;)

Date: 2009-03-04 08:55 pm (UTC)
From: [identity profile] just-developer.livejournal.com
BTW в математике это "бинарные" операторы. Так что вопрос для 0 или 1 аргументов не корректен

Date: 2009-03-05 12:40 am (UTC)
From: [identity profile] ahaxopet.livejournal.com
Прочитайте внимательно исходный пост:

мне потребовалось обобщить стандартные логические операции and и or на произвольное количество аргументов

ААА

Date: 2009-03-05 10:35 am (UTC)
From: [identity profile] just-developer.livejournal.com
Перечитал более чем внимательно.
Бред -причем связанный с упоменанием LISP и прочих "велких", как аргументации верности ответа.
Бинарные операторы AND и OR легко расширить на большее число аргиментов поскольку они обладают
следующими свойствами:

* Коммутативностью: A & B = B & A
* Ассоциативностью: A & ( B & C) = ( A & B ) & C
* Дистрибутивностью: A & ( B | C ) = (A & B) | ( A & C)

* В конце концов - идемпотентностью
A & A = A
A | A = A

Как легко заметить - везде два операнда.
И операция с более чем двумя операндами раскладывается на конечное число операций с двумя операндами.
Всё остальное - бред собачий! Составляйте дальше правильные ответы :) и выбирайте "избранных" сведующих.

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

Re: ААА

Date: 2009-03-05 10:46 am (UTC)
From: [identity profile] just-developer.livejournal.com
Т.е. я бы ещё понял расширение операций на один операнд, на основании идемпотентности...

Date: 2009-03-05 12:38 am (UTC)
From: [identity profile] ahaxopet.livejournal.com
Я где-то говорил про удобство реализации? Я всего лишь спросил, что было бы наиболее естественным обобщением.

Date: 2009-03-05 10:37 am (UTC)
From: [identity profile] just-developer.livejournal.com
"Естественным" по каким критериям????
Мне Манька сказала что наиболее естественным будет возвращать true всегда, а у неё большие груди - поэтому я с ней соглашуcь!

Date: 2009-03-05 11:01 am (UTC)
From: [identity profile] just-developer.livejournal.com
Как вариант - возвращать null или undefined value:

0 & undefined = 0
1 & undefined - undefined
undefined & undefined = undefined

0 | undefined = undefined
1 | undefined = 1
undefined | undefined = undefined

Date: 2009-03-05 12:10 pm (UTC)
From: [identity profile] ahaxopet.livejournal.com
Можно не обобщать, да. Сказать "извините, не обобщается". А можно попытаться обобщить так, чтобы не потерять некоторые свойства исходных операций.

Например, так. Возьмем исходное определение

функция and принимает список логических значений и возвращает истину, если все эти значения истинны

и перепишем его в таком виде:

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

Покажите мне в пустом списке хотя бы один false?

А грубить не надо, пропадает всякое желание спорить. Да я больше и не буду, собственно.

Date: 2009-03-05 12:14 pm (UTC)
From: [identity profile] just-developer.livejournal.com
Грубость была только из-за уже предопределённого мнения....
Причем - безосновательного.Как я наелся таких ситуациию... ;-))

Свойства конечно да - но они выдуманные - личные (личное предпочтение).
А математика к счастью не зависит от мнения политиков

Date: 2009-03-05 05:00 pm (UTC)
From: [identity profile] dimmho.livejournal.com
1)
функция and принимает список логических значений и возвращает истину, если все эти значения истинны

2)
функция and принимает список логических значений и возвращает ложь тогда и только тогда, когда в списке есть хотя бы один false

1) = 2)?
мы можем сказать, что не имея ни одного значения, все имеющиеся у нас значения истинны? Сомневаюсь.

Date: 2009-03-07 12:53 am (UTC)
From: [identity profile] ahaxopet.livejournal.com
Для классической бинарной операции 1)=2), с этим спорить трудно. Я предлагаю такое расширение бинарной операции на произвольное количество аргументов, которое сохраняет это свойство даже при количестве аргументов равным нулю. Точнее, это лисп предлагает, а я соглашаюсь :-)

Date: 2009-12-03 11:59 pm (UTC)
From: [identity profile] zorgeo.livejournal.com
пусть and возвращает 0, если в множестве аргументв существует элемент равный нулю. в пустом множестве его нет. значит, 1.
Page generated Sep. 26th, 2017 04:26 pm
Powered by Dreamwidth Studios