psilogic: (Default)
psilogic ([personal profile] psilogic) wrote2006-07-01 11:03 am

Трехзначная логика на писишке

"С децтва" не любил базы данных... уже сейчас и не вспомню причину, по которой их невзлюбил. Тут по работе, однако, пришлось изучать SQL. Сидел, весь день читал толстенную книженцию, дочитал. Но речь не в том. SQL - довольно старинный язык и интересен тем, что в нем используется трехзначная логика.

Привет журналюгам, которые любят писать о том, что применение трехзначной логики приведет к революции в компьютерной технике. И де она ваша революция? ;))

Логика используется самая что ни на есть "стандартная", ее еще называют трехзначной логикой Лукасевича. Между TRUE и FALSE есть еще промежуточное значение: NULL. По смыслу это NULL соответствует приблизительно выражениям "не известно", "не определено", "не задано", "не указано". Если TRUE ассоциировать с единицей, FALSE с нулем, а NULL - с 1/2, то логические операции в этой логике выглядят так:

A and B = min(A, B)
A or B = max(A, B)
not A = 1 - A

Кстати, закон исключенного третьего в этой логике не выполняется. По нему должно быть:

A or ~A = TRUE

а на самом деле при A = NULL = 1/2 получаем:

A or ~A = NULL or ~NULL = 1/2 or (1 - 1/2) = 1/2 or 1/2 = max(1/2, 1/2) = 1/2 = NULL ≠ TRUE

[identity profile] migmit.livejournal.com 2006-07-01 11:05 am (UTC)(link)
Вообще-то, стандартный фокус для хранения булевского значения в базе - CHAR(0). Значений - ровно два: '' и NULL

[identity profile] psilogic.livejournal.com 2006-07-01 01:35 pm (UTC)(link)
Ну хранить можно по-разному, я немного не о том. В SQL там и сям используются логические условия:
where ...
having ...
и на месте этих многоточий стоят формулы, использующие операции NOT, AND, OR. Так вот эти NOT, AND, OR допускают операнды TRUE, FALSE и NULL.
(deleted comment)

[identity profile] psilogic.livejournal.com 2006-07-01 05:01 pm (UTC)(link)
WHERE работает и на NULL. Например
select * from MyTable where (MyTable.Login = "Smith") and (MyTable.Age = 20)
Если в поле MyTable.Family лежит NULL, то результат выражения (MyTable.Login = "Smith") есть NULL. Далее это NULL обрабатывается операцией NULL and (...). where срабатывает только на TRUE, не срабатывает на FALSE и NULL.