在 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 =:= 1
将 x
绑定到 1
(为了满足约束)并产生 True
但 从不 False
.因此,2 =:= 1
只是失败而不是产生 False
。另一方面,2 == 1
产生 False
。因此,您可能期望 x == 1
将 x
绑定到 1
产生 True
或将 x
绑定到 2
、3
、4
,... 产生 False
。实际上,在 Curry 实现中就是这种情况 KiCS2 但 PAKCS 出于某种原因受到更多限制,因此它会在此表达式上暂停。
进一步说明:可以将 (=:=)
视为 (==)
的优化,可用于仅需要结果 True
的情况,例如,在规则条件中.因此,在这种情况下,较新的 PAKCS 实现会自动将 (==)
转换为 (=:=)
,以便在源程序中只能使用 (==)
。可以在 this paper.
中找到更多详细信息
用这个定义:
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 =:= 1
将 x
绑定到 1
(为了满足约束)并产生 True
但 从不 False
.因此,2 =:= 1
只是失败而不是产生 False
。另一方面,2 == 1
产生 False
。因此,您可能期望 x == 1
将 x
绑定到 1
产生 True
或将 x
绑定到 2
、3
、4
,... 产生 False
。实际上,在 Curry 实现中就是这种情况 KiCS2 但 PAKCS 出于某种原因受到更多限制,因此它会在此表达式上暂停。
进一步说明:可以将 (=:=)
视为 (==)
的优化,可用于仅需要结果 True
的情况,例如,在规则条件中.因此,在这种情况下,较新的 PAKCS 实现会自动将 (==)
转换为 (=:=)
,以便在源程序中只能使用 (==)
。可以在 this paper.