什么类型的系统可以防止逻辑语言中的目标暂停?

时间:2011-01-12 00:29:53

标签: type-systems logic-programming curry

来自curry tutorial的第3.13.3节:


剩余的操作称为刚性操作,而缩小的操作称为灵活操作。所有已定义的操作都是灵活的,而大多数基本操作(如算术运算)都是严格的,因为猜测对它们来说不是一个合理的选择。例如,prelude定义了一个列表连接操作,如下所示:

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] ?

另一方面,添加“+”之类的预定义算术运算是严格的。因此,一个 用逻辑变量作为参数flounders调用“+”:

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

库里似乎没有防止写入将被暂停的目标。什么类型的系统可以提前检测到目标是否会被暂停?

1 个答案:

答案 0 :(得分:3)

您所描述的内容听起来像模式检查,通常会检查哪些输出可用于某组输入。你可能想要检查Mercury的语言,它非常认真地进行模式检查。