Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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
如何在嵌套列表中每秒删除一个元素-PROLOG_Prolog - Fatal编程技术网

如何在嵌套列表中每秒删除一个元素-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)
    谓词中做了