Prolog中的逻辑
因此,我在prolog上编写了删除函数的代码(从列表中删除Val并返回新的Val),首先我编写了以下代码:Prolog中的逻辑,prolog,Prolog,因此,我在prolog上编写了删除函数的代码(从列表中删除Val并返回新的Val),首先我编写了以下代码: removal([], _, []). removal([Val|T], Val, Y) :- removal(T, Val, Y). removal([H | T], Val, Y) :- removal(T, Val, [Y, H]). 这对我来说很有意义: 如果列表为空,请停止 如果列表的标题等于该值,则跳过它 如果列表的标题不等于该值,则将其添加到Y列表的末尾,然后继续,不使用该
removal([], _, []).
removal([Val|T], Val, Y) :- removal(T, Val, Y).
removal([H | T], Val, Y) :- removal(T, Val, [Y, H]).
这对我来说很有意义:
removal([], _, []).
removal([Val|T], Val, Y) :- removal(T, Val, Y).
removal([H | T], Val, [H | Y]) :- removal(T, Val, Y).
这几乎是一样的,除了第三步中的两件事:
我们在列表Y的前面加上H,尽管(我认为)它应该加在末尾;
似乎我们在lhs中添加了它,但对我来说,这感觉有点违反直觉,因为我认为我们检查lhs上的值,就像在第二步中,我们检查H==Val,所以就好像我们在检查列表X和Y是否以相同的值开始
你能解释一下为什么会这样吗?7不要将它添加到列表的末尾。您只能使用
[Y,H]
作为第三个参数进行递归调用。最终,它将致力于评估基本情况删除([],,[])
,但是,取消空列表的位置将因此失败。令人好奇的是,即使在最简单的情况下,一种被认为是声明性的、更易于编程的语言对他们来说,实际上是违反直觉的。@MaxB这是因为数据流的方向并不明确。在函数式语言中,您确切地知道“输出”是什么。在这里,没有那么多。您只是在几个值之间有一个约束。另外,来自其他语言的您实际上是硬编码来查找LHS和RHS的。不确定这是否有帮助。有时它们很难理解。@DavidTonhofer是的,我很想在没有任何编程经验的人身上看到一些心理实验:哪一个更容易:纯Prolog或纯Erlang(或其他什么)你不需要把它添加到列表的末尾。您只能使用[Y,H]
作为第三个参数进行递归调用。最终,它将致力于评估基本情况删除([],,[])
,但是,取消空列表的位置将因此失败。令人好奇的是,即使在最简单的情况下,一种被认为是声明性的、更易于编程的语言对他们来说,实际上是违反直觉的。@MaxB这是因为数据流的方向并不明确。在函数式语言中,您确切地知道“输出”是什么。在这里,没有那么多。您只是在几个值之间有一个约束。另外,来自其他语言的您实际上是硬编码来查找LHS和RHS的。不确定这是否有帮助。有时它们很难理解。@DavidTonhofer是的,我很想在没有任何编程经验的人身上看到一些心理实验:哪个更容易:纯Prolog还是纯Erlang(或其他什么)