Страницы

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

среда, 25 декабря 2019 г.

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

#логика #php


Привет всем. Не попадалась ли кому случайно библиотечка/класс хотя бы с основными
тернарными операциями? Могу реализовать сам, сперва хотелось убедиться, что это не
есть велосипед. Не нагуглил (мог плохо гуглить).
Цель - просто интерес, практика, возможно какое-то использование в проектах, хотя
пока трудновато представить. Что-то подсказывает, что можно отказаться от исключений.
Кто не в курсе - это логика не 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: Ничего общего с тернарным оператором.     


Ответы

Ответ 1



Взялся сам :) Ссылка на тестер (там же можно скачать класс и посмотреть таблицы истинности), листинг основных операторов для будущих поколений: 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, округляющий до ближайшего из логических.

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

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