【问题标题】:Prolog - Filter ListProlog - 过滤器列表
【发布时间】:2012-10-06 17:49:21
【问题描述】:

所以我明天有这个作业。我必须过滤列表的每个第 n 个元素并将其作为列表返回。比如:

?- 每Nth(3,[a,b,c,d,e,f],Rs)。 Rs = [c,f]。

我的想法基本上是:

everynth(N, [X|Xs], L) :- everynth(N, [X|Xs], N, L).
everynth(N, [], C, L).
everynth(N, [X|Xs], 0, [X]) :- everynth(N, Xs, N, [X]).
everynth(N, [X|Xs], C, L) :- C1 is C -1,
  everynth(N,Xs,C1,L).

但它不能以这种方式工作,因为在第三行它尝试匹配 X 和返回 X 以及第二次去那里的 Count 0。

【问题讨论】:

    标签: list filter prolog


    【解决方案1】:

    你快到了。检查这些修改:

    everynth(N, L, NL) :- everynth(N, L, N, NL).
    
    everynth(_, [], _, []).
    everynth(N, [X|Xs], 1, [X|NXs]) :- everynth(N, Xs, N, NXs).
    everynth(N, [_|Xs], C, NXs) :- C1 is C-1, C1>0,
      everynth(N,Xs,C1,NXs).
    

    everynth/4 的第一个子句是递归的终止。当输入列表中没有更多项目时,它应该给出一个空列表。

    everynth/4 的第二个子句处理第 n 个项目,它必须将输入项目放在输出列表中,并继续处理剩余的项目,重新启动你的项目计数器。

    everynth/4 的第三个子句处理不是第 n 个元素的项目,因此您必须跳过该项目,递减计数器并继续处理剩余的项目。

    【讨论】:

      【解决方案2】:
      everynth(_, _, [], R, R).
      everynth(1, M, [X|Xs], Z, R) :- append(Z, [X], Z1),  everynth(M, M, Xs, Z1, R).              
      everynth(N, M, [_|Xs], Z, R) :- N > 1, N1 is N - 1, everynth(N1, M, Xs, Z, R).
      
      
      
      
      ?- everynth(3, 3, [a,b,c,d,e,f], [], Rs).
      Rs = [c, f] .
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        相关资源
        最近更新 更多