List 如何删除所有事件?
我试图理解为什么代码1工作正常,但代码2输出错误: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
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).