【问题标题】:delete only middle elements except first and last element只删除除第一个和最后一个元素之外的中间元素
【发布时间】:2017-12-27 13:55:34
【问题描述】:

示例;我有一个列表 [1,2,3,a,f,s,h,u,4,5]。我想删除 2,3,a,f,s,h,u,4 最终结果将 [1,5]。我如何在 Prolog 中编写谓词?

delete(A, [A|B], B).      
delete(A, [B, C|D], [B|E]) :-  
    delete(A, [C|D], E).

【问题讨论】:

  • [a] 呢?

标签: prolog


【解决方案1】:

考虑此类基于序列的问题的一个好方法是使用 DCG(定句语法),它是大多数常见 Prolog 发行版(例如 SWI 和 GNU)的标准部分:

first_last([First, Last]) --> [First], ..., [Last].

... --> [].
... --> [_], ... .

first_and_last(L, FirstLast) :-
   phrase(first_last(FirstLast), L).

【讨论】:

  • ...由于一些命运多舛的政治问题,DCG 尚未成为标准的一部分。
  • @false 啊好吧,抱歉我说错了。更非正式地说,我应该说它们是流行的 Prolog 发行版(如 SWI 和 GNU)的标准部分。
  • 它几乎无处不在
【解决方案2】:

首先,这应该是 delete/2 谓词,而不是 delete/3。

基本子句应该是一个只有两个成员的列表,而递归子句应该删除第二个元素,然后继续:

delete([A,B], [A,B]).
delete([A,_|R], X) :- delete([A|R], X).

Demo.

【讨论】:

    【解决方案3】:

    你可以使用 append/3:

    ?- X=[1,2,3,a,f,s,h,u,4,5].
    X = [1, 2, 3, a, f, s, h, u, 4|...].
    
    ?- append([F|_],[L],$X).
    F = 1,
    L = 5,
    X = [1, 2, 3, a, f, s, h, u, 4|...] .
    

    或追加/2

    ?- append([[F],_,[L]],$X).
    F = 1,
    L = 5,
    X = [1, 2, 3, a, f, s, h, u, 4|...] .
    

    甚至是@lurker 答案的更简洁版本:

    ?- [user].
    |: ... --> [] | ([_], ...).
    |: ^D% user://1 compiled 0.01 sec, 1 clauses
    true.
    
    ?- phrase(([F],...,[L]),$X).
    F = 1,
    L = 5,
    X = [1, 2, 3, a, f, s, h, u, 4|...] ;
    false.
    

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 2019-11-17
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      相关资源
      最近更新 更多