您好,我希望有关此任务的一些建议或建议:
定义一个带有三个参数的语句,其中第一个是列表,第二个是元素(原子或列表),最后一个是必须完成它的列表,它等于第一个但第一个与第二个参数匹配的list'元素,消失了。
Examples:
> elimina([f, e, d, [a, h], a, d, a], a, L)
L = [f, e, d, [a, h], d]
> elimina([f, e, d, [ a, h], a, [d, a]], [a, h], L)
L = [f, e, d, a, [d, a]]
我试过了:
elimina([],_,[]).
elimina([X],X,[]).
elimina([X],Y,[X]).
elimina([H|T],H,Result) :-
elimina([T],H,Result).
elimina([H|T],Y,Result):-
elimina([T],H,Result).
当我大喊递归调用时,我不确定该写些什么:
elimina([T],H,Result).
因为首先,我不知道当输入的第二个元素匹配头部而不是不匹配头部时,行为应该有什么不同;所以我打了同样的电话。
我也怀疑,因为:真的需要放下基本案例:
elimina([X],Y,[X]).
吗?我认为我们可以通过将要删除的元素与真正包含在列表中的元素匹配来通过练习。感谢您的时间。
最佳答案
有一种非常通用的方法可以在Prolog中测试您自己的代码。只需要求Prolog通过最普遍的问题生成所有可能性。
| ?- elimina([], D, Ys).
Ys = []. % 1: nice!
| ?- elimina([X], D, Ys).
D = X, % 1: nice!
Ys = []
; Ys = [X] % 2: lacks dif(X, D)
; X = [], % 3: correct but subsumed by 1
D = [],
Ys = []
; D = X, % 4: incorrect
Ys = [[]]
; X = [], % 5: correct but subsumed by 1
D = [],
Ys = []
; X = [], % 6: incorrect
D = [],
Ys = [[]]
; X = [], % 7: correct but subsumed by 1
D = [],
Ys = []
; ...
对于空列表,一切都很好。但是对于单元素列表,有很多多余的答案!实际上,应该只有两个答案:
D = X, Ys = []
; dif(D, X), Ys = [X].
因此,现在选择一些您想改善的情况!
也许采用答案4,并设置D = a,X = a:
| ?- elimina([a], a, Ys).
Ys = [] % 1: nice
; Ys = [a] % 2: incorrect
; Ys = [[]] % 3: incorrect
; Ys = [] % 4: correct but subsumed by 1
; Ys = [[]] % 5: incorrect and subsumed by 3
; Ys = [] % 6: correct but subsumed by 1
; ...
因此,我将选择实际上应该失败的#3,但不会失败
| ?- elimina([a],a,[[]]).
true
; true
; ...
通过插入
false
和一些其他公式来缩小罪魁祸首:| ?-elimina([a],a,[[]])。
假。
elimina([],_,[]):-错误。
elimina([X],X,[]):-否。
elimina([X],Y,[X]):-Y = a,X = []。
elimina([H | T],H,Result):-假,
elimina([T],H,Result)。
elimina([H | T],Y,Result):-结果= [[]],
elimina([T],H,Result)。
现在看看剩下的,然后思考一下。这些其余规则真的应该成立吗?
其余可见部分一定有错误!