Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 在咖喱(PAKCS)中倒装'member'不会给出答案_Functional Programming_Logic Programming_Curry_Functional Logic Progr - Fatal编程技术网

Functional programming 在咖喱(PAKCS)中倒装'member'不会给出答案

Functional programming 在咖喱(PAKCS)中倒装'member'不会给出答案,functional-programming,logic-programming,curry,functional-logic-progr,Functional Programming,Logic Programming,Curry,Functional Logic Progr,根据这一定义: member _ [] = False member x (h:t) = if x == h then True else member x t Ubuntu18.04中的PAKCS 2.0.1没有给出任何答案、警告或错误: Top-level binding with no type signature: member :: Prelude.Eq a => a -> [a] -> Prelude.Bool member> membe

根据这一定义:

member _ [] = False
member x (h:t) = if x == h then True else member x t
Ubuntu18.04中的PAKCS 2.0.1没有给出任何答案、警告或错误:

    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-0.9.12-alt1.dev20141223.x86_64上安装了另一个Curry实现,正在使用该实现进行一些实验:


在Curry编程语言中,==似乎不是一种可以统一不确定值的函数

在我的系统Curry-0.9.12-alt1.dev20141223.x86_64上安装了另一个Curry实现,正在使用该实现进行一些实验:

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

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,。。。屈服于虚假。实际上,Curry实现中就是这种情况,但是由于某些原因,PAKCS受到了更多的限制,因此它挂起在这个表达式上

还有一句话:可以将=:=视为==的优化,可以在只需要结果True的情况下使用,例如,在规则条件下。因此,在这种情况下,较新的PAKCS实现会自动将==转换为=:=以便在源程序中只能使用==。更多详细信息可以在中找到。

自规则生效以来,程序只给出一种解决方案

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,。。。屈服于虚假。实际上,Curry实现中就是这种情况,但是由于某些原因,PAKCS受到了更多的限制,因此它挂起在这个表达式上


还有一句话:可以将=:=视为==的优化,可以在只需要结果True的情况下使用,例如,在规则条件下。因此,在这种情况下,较新的PAKCS实现会自动将==转换为=:=以便在源程序中只能使用==。进一步的细节可以在中找到。

如果我在成员定义中将==替换为=:=,那么我得到1个答案2仍然是missing@MaxB最好用=:=显示代码,因为它的返回类型不是Bool,所以==和=:=不能互换。这样它对我有效:Prelude>let memberConstr x h:t=x=:=h?memberConstr x[1,2,3]中的memberConstr x t,其中x free给出:{x=1}个解?[Yes/no/all]a{x=2}{x=3}Prelude>与Q:t成员中的代码相差1个字符:t成员给我成员::a->[a]->Bool。当我从上面的评论中输入你的字符串时,我立刻得到所有3个答案。这可能是版本/实现上的差异。你没有使用pakcs吗?@MaxB没有,我在不同的实现中运行了我的测试——一个用C编写的实现,名为Muenster Curry,在我的例子中也很旧。我会试试你的1个字符的差异,看看,但我的期望是,类型不会匹配。也许,从那时起咖喱的规格就改变了,所以=:=在现代有了不同的类型?我的是:Prelude>:t=:==\u 1->\u 1->Success也许,它不是Success,而是您的PAKC中的多态性。@MaxB是的,在我的例子中:Term:x=:=h推断类型:Success预期类型:Bool类型Bool和Success不兼容如果我在成员定义中将==替换为=:=那么我得到1个答案2仍然是missing@MaxB最好使用=:=,显示您的代码,因为它的返回类型不是Bool,所以==和=:=不能互换。这样它对我有效:Prelude>let memberConstr x h:t=x=:=h?memberConstr x[1,2,3]中的memberConstr x t,其中x free给出:{x=1}个解?[Yes/no/all]a{x=2}{x=3}Prelude>与Q:t成员中的代码相差1个字符:t成员给我成员::a->[a]->Bool。当我从上面的评论中输入你的字符串时,我立刻得到所有3个答案。这可能是版本/实现上的差异。你没有使用pakcs吗?@MaxB没有,我在不同的实现中运行了我的测试——一个用C编写的实现,名为Muenster Curry,在我的例子中也很旧。我会试试你的1个字符的差异,看看,但我的期望是,类型不会匹配。也许,咖喱的规格从此改变了,所以=:=在现代有了不同的类型 你要什么?我的是:Prelude>:t=:=\u 1->\u 1->成功也许不是成功,而是你的PAKC中的多态性。@MaxB是的,在我的例子中:Term:x=:=h推断类型:Success预期类型:Bool类型Bool和Success不兼容成员的实现与unifing=:=而不是non-unifing==不正确:要计算if-then-else项,它将首先通过搜索解决方案来计算x=:=h。如果它成功地将x与h统一起来,则该项的值始终为True,并且计算继续进行If-then-else。否则,如果没有解,则整个表达式和整个函数都没有解。else部分永远不会被计算并给出结果。使用Unifing=:=而不是非Unifing==的成员的实现将是不正确的:要计算if-then-else项,它将首先通过搜索解决方案计算x=:=h。如果它成功地将x与h统一起来,则该项的值始终为True,并且计算继续进行If-then-else。否则,如果没有解,则整个表达式和整个函数都没有解。其他部分永远不会得到评估并给出结果。