@pqgg7nwkd4

Как определить, что три предиката равны между собой, указывая их по одному разу в выражении?

Таблица истинности такая:
A	B	C	?
1	1	1	1
1	1	0	0
1	0	1	0
1	0	0	0
0	1	1	0
0	1	0	0
0	0	1	0
0	0	0	1

Истина, когда либо все аргументы - истины, либо когда все аргументы - лжи.

Где, A, B, C - предикаты - выражения, принимающие значения true или false.
Нужна формула для таблицы выше, в которой A, B, C присутствуют по одному разу.
Желательно, чтобы формула была масштабируемой до 4х и более значений.
Чем проще будет формула, тем лучше.
Язык: postgresql (версии 12), создавать функции нельзя, можно использовать стандартные функции и расширения, которые идут вместе с погресом и добавляются с помощью CREATE EXTENSION.

Вот примеры решения:
(SELECT bool_and(a) = bool_or(a) FROM unnest(ARRAY[A, B, C]) a(a))

A::int + B::int + C::int IN (0, 3)


Может есть идеи по-проще, получше?
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 1
Stalker_RED
@Stalker_RED
CREATE EXTENSION intarray;

1. sort( ARRAY[4,3,2,1] ); -- поместит значения в массив, отсортировать его
2. сравнить первый и последний элемент, если они равны, то и остальные все равны

Пример:
select arr[1] = arr[array_upper(arr, 1)] as isEqual
  from sort(ARRAY[1,87,5,456,34,1]) as arr;  -- false

select arr[1] = arr[array_upper(arr, 1)] as isEqual
  from sort(ARRAY[1,1,1]) as arr;  -- true

select arr[1] = arr[array_upper(arr, 1)] as isEqual
  from sort(ARRAY[0,0,0,0]) as arr;  -- true

https://rextester.com/WKFL32015
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы