Prolog中的逻辑

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列表的末尾,然后继续,不使用该

因此,我在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, [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(或其他什么)