您好,我希望对此任务有一些建议或意见:
定义一个带有三个参数的语句,其中第一个是列表,第二个是元素(原子或列表),最后一个是必须完成它的列表等于第一个匹配第二个参数的列表元素,消失了.
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]]
Run Code Online (Sandbox Code Playgroud)
我试过了:
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).
Run Code Online (Sandbox Code Playgroud)
当我喊出递归调用时,我怀疑要写什么:
elimina([T],H,Result).
Run Code Online (Sandbox Code Playgroud)
因为首先我不知道输入第二个元素与头部匹配时的行为应该有多么不同,而不是与头部匹配; 所以我打了同样的电话.我也怀疑因为:真的需要把基础案例: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 = []
; ...
Run Code Online (Sandbox Code Playgroud)
对于空列表一切都很好.但对于单元素列表,有许多多余的答案!实际上,应该只有两个答案:
D = X, Ys = []
; dif(D, X), Ys = [X].
Run Code Online (Sandbox Code Playgroud)
所以现在选择一些你想改进的案例吧!
也许回答#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
; ...
Run Code Online (Sandbox Code Playgroud)
所以我会选择#3实际应该失败,但不会
| ?- elimina([a],a,[[]]).
true
; true
; ...
Run Code Online (Sandbox Code Playgroud)
通过插入false一些额外的方程式来缩小罪魁祸首:
| ?- elimina([a],a,[[]]).
false.
elimina([],_,[]) :- false.
elimina([X],X,[]) :- false.
elimina([X],Y,[X]) :- Y = a, X = [].
elimina([H|T],H,Result) :- false,
elimina([T],H,Result).
elimina([H|T],Y,Result):- Result = [[]],
elimina([T],H,Result).
现在看看剩下的东西并考虑一下.这些剩余规则真的应该成立吗?
在剩余的可见部分必定有错误!