2015-11-18 2 views
3

При попытке понять core.logic hgh API-документы я сталкиваюсь с нереальными целями и реляционными целями. Я понятия не имею, что это означает на практике и почему важно комментировать цели, если они реляционные или нет.Что означает нереляционная на практике для core.logic?

Можете ли вы объяснить на примере, как цели используются по-разному в зависимости от того, являются ли они реляционными или нет?

ответ

6

Для того чтобы объяснить, что означает не относящееся к делу отношение, нам нужно пересмотреть, что означает relational.

Если вы рассматриваете чистые функции в функциональном программировании, они всегда возвращают одно значение, и для тех же входных аргументов возвращается одно и то же выходное значение.

Скажет, например:

f(x) = x + 2 

Эта функция всегда возвращает 5 для ввода значения 3.

Но есть много ситуаций, когда функции не подходят, как квадратный корень, который имеет 2 результата.

sqrt(4) => 2 and -2 

Или разделить число на ноль, без результатов

Проводы отношение как обобщенной функции, то есть:

  • Любое количество результатов (ноль или более)
  • Не детерминированные
  • аргументы ввода/вывода могут быть разными для каждого вызова
  • Отношения retu rn true если отношение истинно и false в противном случае.

Для того, чтобы преобразовать функцию в отношении мы устанавливаем результат как новый параметр:

(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]) 

В логическом программировании объединение отвечает на вопрос: Какой мир должен выглядеть, если это отношение будет удовлетворено?

Оператор или функция A non-relational является оператором, который не работает как отношение, а как простая функция, поэтому объединение любого параметра как переменной невозможно.

Это произошло, например, с операторами, такими как > и < до CLP над конечными доменами было введено в пространстве имен clojure.core.logic.fd.

Многие из концепций здесь вы найдете в this talk от Ambrose Bonnaire-Sergeant.

+1

Не могли бы вы привести пример того, почему conda и condu не являются реляционными, но conde? – user3139545

+0

'conde' исследует все ветви,' conda' работает как оператор, вырезанный прологом и заканчивающийся при обнаружении первого решения. Поэтому 'conda' не находит всех результатов, удовлетворяющих соотношению, но только первого. –

+0

Так что из 4 пунктов, которые вы указали в answere, это то, что делает conda не отношением? – user3139545

Смежные вопросы