在 Curry (PAKCS) 中反转 `member` 没有给出答案

Inverting `member` in Curry (PAKCS) gives no answers

用这个定义:

member _ [] = False
member x (h:t) = if x == h then True else member x t

PAKCS 2.0.1(来自 Ubuntu 18.04)没有给出答案、警告或错误:

    Top-level binding with no type signature:
      member :: Prelude.Eq a => a -> [a] -> Prelude.Bool
member> member x [1, 2, 3] =:= True where x free
member> 

我希望看到 3 个值。我在这里做错了什么?

好像在Curry编程语言中,==并不是一种可以统一非确定值的函数

用恰好安装在我系统上的另一个 Curry 实现做一些实验 (curry-0.9.12-alt1.dev20141223.x86_64):

Prelude> (x == 'a') =:= True where x free
Suspended
Prelude> let match_a 'a' = True in match_a x =:= True where x free
{x = 'a'}
Prelude> 

程序只给出了一个解决方案,因为规则

member x (h:t) = if x =:= h then True else member x t

x 与列表的第一个元素统一起来,并产生 True 而没有其他。 请注意 (=:=) 是统一约束而不是布尔测试。这意味着 x =:= 1x 绑定到 1 (为了满足约束)并产生 True 从不 False.因此,2 =:= 1 只是失败而不是产生 False。另一方面,2 == 1 产生 False。因此,您可能期望 x == 1x 绑定到 1 产生 True 或将 x 绑定到 234,... 产生 False。实际上,在 Curry 实现中就是这种情况 KiCS2 但 PAKCS 出于某种原因受到更多限制,因此它会在此表达式上暂停。

进一步说明:可以将 (=:=) 视为 (==) 的优化,可用于仅需要结果 True 的情况,例如,在规则条件中.因此,在这种情况下,较新的 PAKCS 实现会自动将 (==) 转换为 (=:=),以便在源程序中只能使用 (==)。可以在 this paper.

中找到更多详细信息