Есть ли разница между N-арной функцией в Карри и N+1-арным отношением в Прологе?

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

      foo 1 2 = 3
foo 1 2 = 4

и он выполняет возврат (или какой-либо другой поиск), чтобы исследовать последствия такого недетерминизма.

Это делает его похожим на Пролог (особенно на λProlog из-за системы типов и синтаксиса), где вместо этого вы должны указать

      foo 1 2 3.
foo 1 2 4.

Есть ли семантическая разница между N- арной функцией Карри и N+1- арным отношением Пролога?

2 ответа

Разница между Curry и Prolog заключается в зависимости между аргументами и результатами, которая является основой для оптимальной стратегии оценки, используемой в Curry. Подобно Haskell, Curry использует ленивую (необходимую) стратегию оценки. Следствием этого является то, что пространство поиска исследуется в зависимости от спроса.

Например, выражение

      (xs ++ [1]) ++ ys =:= []

имеет конечное пространство поиска в Карри (без ответа), тогда как эквивалентная цель Пролога

      ?- append(Xs,[1],Zs), append(Zs,Ys,[]).

имеет бесконечное пространство поиска. Точно так же есть примеры, когда Карри вычисляет решение в отличие от Пролога (например, Карри допускает вычисления с бесконечными структурами подобно Хаскелю).

Таким образом, Карри расширяет стратегию оценки Haskell, основанную на спросе, на недетерминированное программирование, в то время как Пролог основан на строгой оценке.

Поразмыслив еще немного, я понял, что главное отличие в том, что в Прологе оба

      foo 1 2 3.
foo 1 2 4.

может быть истинным одновременно , в то время как в Карри оба

      foo 1 2 == 3
foo 1 2 == 4

не может быть истинным одновременно. (В ПАККС, ==а также =:=возвращаться Bool)

Другие вопросы по тегам