Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/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
List 如何删除所有事件?_List_Prolog_Prolog Dif - Fatal编程技术网

List 如何删除所有事件?

List 如何删除所有事件?,list,prolog,prolog-dif,List,Prolog,Prolog Dif,我试图理解为什么代码1工作正常,但代码2输出错误: remove(X,[],[]). remove(X,[X|Y],Z):-remove(X,Y,Z). % [X|Y] is the input list remove(X,[F|Y],[F|Z]):-remove(X,Y,Z). % code 1 remove(X,[],[]). remove(X,[X|Y],Z):-remove(X,Y,Z). % [X|Y] is the input list remove(X,[F|Y],Z):-re

我试图理解为什么代码1工作正常,但代码2输出错误:

remove(X,[],[]).
remove(X,[X|Y],Z):-remove(X,Y,Z). % [X|Y] is the input list
remove(X,[F|Y],[F|Z]):-remove(X,Y,Z). % code 1


remove(X,[],[]).
remove(X,[X|Y],Z):-remove(X,Y,Z). % [X|Y] is the input list
remove(X,[F|Y],Z):-remove(X,Y,[F|Z]). % code 2
考虑质疑

?-删除(x[x,a,b,c,x,d],R)。

代码2的问题是,在提取第二个列表中的所有元素后,它在某个时刻变为空。此时,在递归时,唯一可能的选择是第一个子句,因为第二和第三个子句要求列表有一个头,而不是因为它是空的

因此,它试图与第一个国家实现统一。现在,前两个谓词很好,但最后一个谓词有问题

也就是说,它试图统一
[]=[d,c,b,a | | u free.][/code>。这是不可能的,因为[]不是“自由变量”

然而,我的术语可能是错误的。。。但我相信本质是存在的。

考虑质疑

?-删除(x[x,a,b,c,x,d],R)。

代码2的问题是,在提取第二个列表中的所有元素后,它在某个时刻变为空。此时,在递归时,唯一可能的选择是第一个子句,因为第二和第三个子句要求列表有一个头,而不是因为它是空的

因此,它试图与第一个国家实现统一。现在,前两个谓词很好,但最后一个谓词有问题

也就是说,它试图统一
[]=[d,c,b,a | | u free.][/code>。这是不可能的,因为[]不是“自由变量”


然而,我的术语可能是错误的。。。但是我相信本质是存在的。

你提出的两个谓词-
code 1
code 2
-都被破坏了

您没有注意到这一点的原因是:查询


#1) 考虑在

中显示的查询

  • 您希望成功的查询:

    ?- remove(x,[x,a,x,p],[a,p]).   % x is first element
    ?- remove(x,[a,x,p,x],[a,p]).   % x is last element
    ?- remove(x,[a,x,p],[a,p]).
    
  • 您希望失败的查询

    ?- \+ (remove(x,[a,x,p],Ls), dif(Ls,[a,p])).
    
  • 地面查询:

    ?- remove(x,[],[]).
    
  • 非地面查询(带变量的查询):

  • 底线是: 如果没有查询,您不是在编写代码,而是在编写文本


    #3)现在让我们开始修复
    代码1
    :看看这两个递归子句

    remove(X,[X|Y],Z) :- remove(X,Y,Z). remove(X,[F|Y],[F|Z]) :- remove(X,Y,Z).
    您提供的两个谓词-
    code 1
    code 2
    都已损坏

    您没有注意到这一点的原因是:查询


    #1) 考虑在

    中显示的查询

  • 您希望成功的查询:

    ?- remove(x,[x,a,x,p],[a,p]).   % x is first element
    ?- remove(x,[a,x,p,x],[a,p]).   % x is last element
    ?- remove(x,[a,x,p],[a,p]).
    
  • 您希望失败的查询

    ?- \+ (remove(x,[a,x,p],Ls), dif(Ls,[a,p])).
    
  • 地面查询:

    ?- remove(x,[],[]).
    
  • 非地面查询(带变量的查询):

  • 底线是: 如果没有查询,您不是在编写代码,而是在编写文本


    #3)现在让我们开始修复
    代码1
    :看看这两个递归子句

    remove(X,[X|Y],Z) :- remove(X,Y,Z). remove(X,[F|Y],[F|Z]) :- remove(X,Y,Z).
    代码2的第三个子句似乎没有逻辑意义。它的意思与代码1的第三条完全不同。递归最终将无法匹配基本情况。您能帮我跟踪它吗,因为我似乎不明白基本情况如何不匹配,谢谢。请添加一些您使用的(最好是地面)查询。查看递归调用。它会在第三个参数的列表中保留一个附加元素。基本情况假设第三个参数倾向于空列表。它不可能匹配。代码2的第三个子句似乎没有逻辑意义。它的意思与代码1的第三条完全不同。递归最终将无法匹配基本情况。您能帮我跟踪它吗,因为我似乎不明白基本情况如何不匹配,谢谢。请添加一些您使用的(最好是地面)查询。查看递归调用。它会在第三个参数的列表中保留一个附加元素。基本情况假设第三个参数倾向于空列表。不可能匹配。@false。谢谢!Okidoki@错。谢谢!奥基多基。 remove(_X, [], []). remove(X, [X|Y], Z) :- remove(X, Y, Z). remove(X, [F|Y], [F|Z]) :- dif(X, F), remove(X, Y, Z).