如何在嵌套列表中每秒删除一个元素-PROLOG
假设我有一个类似于如何在嵌套列表中每秒删除一个元素-PROLOG,prolog,Prolog,假设我有一个类似于[1,2,1,2],[3,1,1,1,3],[1,1],[2,2,1,3]的列表,我想从中删除每隔一秒出现的'1',作为[1,2,2],[3,1,[[3]],1,1,1],2,2,1,3]的结果列表。到目前为止,我得出的结论是: delete_second_occurrence([], [], _, _). delete_second_occurrence([X|L], [X|R], X, N) :- 0 is mod(N, 2), N1 is N + 1,
[1,2,1,2],[3,1,1,1,3],[1,1],[2,2,1,3]
的列表,我想从中删除每隔一秒出现的'1',作为[1,2,2],[3,1,[[3]],1,1,1],2,2,1,3]
的结果列表。到目前为止,我得出的结论是:
delete_second_occurrence([], [], _, _).
delete_second_occurrence([X|L], [X|R], X, N) :-
0 is mod(N, 2),
N1 is N + 1,
delete_second_occurrence(L, R, X, N1).
delete_second_occurrence([X|L], R, X, N) :-
1 is mod(N, 2),
N1 is N + 1,
delete_second_occurrence(L, R, X, N1).
delete_second_occurrence([E|L], [E|R], X, N) :-
is_list(E),
delete_second_occurrence(E, R, X, N),
delete_second_occurrence(L, R, X, N).
delete_second_occurrence([E|L], [E|R], X, N) :-
delete_second_occurrence(L, R, X, N).
澄清一下,
- R是结果列表
- L是输入列表
- X是我要删除的元素
- N是遇到X的次数
它每隔一秒删除一次最底层的引用,但对嵌套列表不执行任何操作。如何删除嵌套列表中的重复项?主要问题是第四条:
delete_second_occurrence([E|L], [E|R], X, N) :-
is_list(E),
delete_second_occurrence(E, R, X, N),
delete_second_occurrence(L, R, X, N).
delete_second_occurrence([E|L], [E|R], X, N) :-
delete_second_occurrence(L, R, X, N).
如果R
是每秒删除E
中出现的X
的结果,则第二个条件为真。如果R
是每秒删除L
中出现的X
的结果,则第三个条件为真。此外,N
在调用E
和L
上的delete\u second\u事件后必须具有相同的值。没有多少列表具有这些属性。有两个问题需要解决:
在第一次调用delete\u second\u occurrence
时选择不同的变量名,并适当地更新子句的开头
引入另一个参数,该参数表示递归调用后累加器的状态
您可以使用布尔变量,而不是计算遇到X
的次数。不需要执行模运算。执行此操作后,您将注意到您的程序生成了一个正确的解决方案和几个错误的解决方案。例如,考虑第五个条款:
delete_second_occurrence([E|L], [E|R], X, N) :-
is_list(E),
delete_second_occurrence(E, R, X, N),
delete_second_occurrence(L, R, X, N).
delete_second_occurrence([E|L], [E|R], X, N) :-
delete_second_occurrence(L, R, X, N).
本条款规定,[E | R]
是在[E | L]
中每秒删除X
的结果,如果R
是在L
中每秒删除X
的结果。这并不总是正确的。例如,如果N
为1
且E
与X
相结合,则您肯定不希望在输出列表中包含E
。类似地,如果E
是一个包含X
的列表,您可能不应该生成简单地将E
前置到递归调用结果的解决方案。也对E
使用递归。我在上面的delete\u第二次出现(E,R,X,N)
谓词中做了