Страницы

Поиск по вопросам

вторник, 27 ноября 2018 г.

Ищу библиотеку, троичная логика

Привет всем. Не попадалась ли кому случайно библиотечка/класс хотя бы с основными тернарными операциями? Могу реализовать сам, сперва хотелось убедиться, что это не есть велосипед. Не нагуглил (мог плохо гуглить). Цель - просто интерес, практика, возможно какое-то использование в проектах, хотя пока трудновато представить. Что-то подсказывает, что можно отказаться от исключений. Кто не в курсе - это логика не 1/0, а 1/0/-1. Пару лет назад такое писал, но проект отправился в рай для жестких дисков. Код получался примерно такой: // true3=1="да", false3=-1="нет", null3=0="не знаю" $systemStatus = and3($s1->getstatus(), $s2->getstatus(), $s3->getstatus()); if ($systemStatus === true3) { echo 'all systems: ready'; } elseif ($systemStatus === false3) { echo 'all systems: idle'; } else echo 'malfunction'; PS: Ничего общего с тернарным оператором.


Ответ

Взялся сам :)
Ссылка на тестер (там же можно скачать класс и посмотреть таблицы истинности), листинг основных операторов для будущих поколений:
define('TRUE3', 1); define('NULL3', 0); define('FALSE3', -1);
function l3validate(&$arg) { if ($arg !== FALSE3 and $arg !== NULL3 and $arg !== TRUE3) { $arg = NULL3; return FALSE3; } return TRUE3; }
function l3not($a) { // НЕ, инверсия l3validate($a); if ($a === TRUE3) return FALSE3; if ($a === FALSE3) return TRUE3; return NULL3; } function l3and($a, $b) { // И, конъюнкция l3validate($a); l3validate($b); if ($a === TRUE3 and $b === TRUE3) return TRUE3; if ($a === FALSE3 or $b === FALSE3) return FALSE3; return NULL3; } function l3andm() { // И, несколько аргументов $result = TRUE3; foreach (func_get_args() as $arg) { l3validate($arg); if ($arg === NULL3) $result = NULL3; if ($arg === FALSE3) return FALSE3; } return $result; } function l3or($a, $b) { // ИЛИ, дизъюнкция l3validate($a); l3validate($b); if ($a === $b and $a === FALSE3) return FALSE3; if ($a === TRUE3 or $b === TRUE3) return TRUE3; return NULL3; } function l3orm() { // ИЛИ, несколько аргументов $result = FALSE3; foreach (func_get_args() as $arg) { l3validate($arg); if ($arg === NULL3) $result = NULL3; if ($arg === TRUE3) return TRUE3; } return $result; } function l3xor($a, $b) { // ЛИБО ... ЛИБО ..., строгая дизъюнкция l3validate($a); l3validate($b); if ($a === $b and $a !== NULL3) return FALSE3; if (($a === TRUE3 and $b === FALSE3) or ($a === FALSE3 and $b === TRUE3)) return TRUE3; return NULL3; } function l3imp($a, $b) { // ->, импликация l3validate($a); l3validate($b); if ($a === FALSE3 or $b === TRUE3) return TRUE3; if ($a === TRUE3 and $b === FALSE3) return FALSE3; return NULL3; } function l3bimp($a, $b) { // <-, обратная импликация l3validate($a); l3validate($b); if ($a === TRUE3 or $b === FALSE3) return TRUE3; if ($a === FALSE3 and $b === TRUE3) return FALSE3; return NULL3; } function l3eq($a, $b) { // =, эквивалентность l3validate($a); l3validate($b); if ($a === NULL3 or $b === NULL3) return NULL3; if ($a === $b) return TRUE3; return FALSE3; }
ЗЫ: Специально для @Dex: обсуждение терминов, таки ваша взяла) Но все же посмотрите обсуждение, оно оказалось сложным и чисто эстетическим. Даже вариант "трехвалентная" был бы верным лексически %)
UPDATE: Исправил "идейно", любое "неопознанное" превращается в NULL3. Если хочется быть более толерантным, в классе есть метод cast, округляющий до ближайшего из логических.

Комментариев нет:

Отправить комментарий