Что на практике означает нереляционный для core.logic?
Пытаясь понять core.logic через API-документы, я сталкиваюсь с нереляционными целями и реляционными целями. Я понятия не имею, что это означает на практике и почему важно аннотировать цели, если они реляционные или нет.
Можете ли вы объяснить на примере, как цели используются по-разному в зависимости от того, являются ли они реляционными или нет?
1 ответ
Чтобы объяснить, что означает нереляционный, нам нужно вернуться к тому, что relational
средства.
Если вы рассматриваете чистые функции в функциональном программировании, они всегда возвращают одно значение, и для одинаковых входных аргументов возвращается одно и то же выходное значение.
Скажем, например:
f(x) = x + 2
Эта функция всегда возвращает 5
для входного значения 3
,
Но есть много ситуаций, когда функции неуместны, как квадратный корень, который имеет 2 результата.
sqrt(4) => 2 and -2
Или разделите число на ноль, без результатов
Рассматривая отношение как обобщенную функцию, вы получаете:
- Любое количество результатов (ноль или более)
- Недетерминированный
- аргументы in / out могут быть разными для каждого вызова
- Отношения возвращают истину, если отношение истинно, и ложь в противном случае.
Чтобы преобразовать функцию в отношение, мы устанавливаем результат как новый параметр:
(cons 1 [2]) => [1 2]
(conso 1 [2] [1 2]) => true
Но сейчас conso
может использоваться как генератор, если один аргумент является переменной:
(run 1 [x]
(conso 1 [2] x)) => ([1 2])
(run 1 [x]
(conso 1 x [1 2])) => ([2])
В логическом программировании объединение отвечает на вопрос: как должен выглядеть мир, чтобы это отношение было удовлетворено?
non-relational
оператор или функция - это оператор, который работает не как отношение, а как простая функция, поэтому объединение, принимающее любой параметр в качестве переменной, невозможно.
Это произошло, например, с такими операторами, как >
а также <
до CLP
над конечными доменами был введен в пространство имен clojure.core.logic.fd
,
Многие концепции здесь вы можете найти в этом выступлении Амвросий Бонньер-сержант.