Подтвердить что ты не робот

Какие системы типов могут препятствовать приостановке целей в логических языках?

Из раздела 3.13.3 учебника curry:


Операции, которые вычеты называются жесткими, тогда как операции, узкие, называются гибкими. Все определенные операции являются гибкими, тогда как большинство примитивных операций, таких как арифметические операции, являются жесткими, поскольку угадывание для них не является разумным вариантом. Например, прелюдия определяет операцию конкатенации списка следующим образом:

infixr 5 ++
...
(++)             :: [a] -> [a] -> [a]
[]       ++ ys   = ys
(x:xs) ++ ys     = x : xs ++ ys

Поскольку операция "++" является гибкой, мы можем использовать ее для поиска списка, удовлетворяющего определенному свойству:

Prelude> x ++ [3,4] =:= [1,2,3,4]       where x free
Free variables in goal: x
Result: success
Bindings:
x=[1,2] ?

С другой стороны, предопределенные арифметические операции, такие как добавление "+", являются жесткими. Таким образом, вызовите "+" с логической переменной в качестве аргумента:

Prelude> x + 2 =:= 4 where x free
Free variables in goal: x
*** Goal suspended!

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

4b9b3361

Ответ 1

То, что вы описали, похоже на проверку режима, которая обычно проверяет, какие выходы будут доступны для определенного набора входов. Возможно, вам захочется проверить язык Mercury, который очень серьезно относится к режиму проверки.