Есть ли разница между 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
)