【问题标题】:Longest sequence in prologprolog中最长的序列
【发布时间】:2016-02-04 14:07:10
【问题描述】:

我必须从 Prolog 的列表中删除最长的素数序列。 我是 Prolog 的新手,我找不到达到最长序列的方法...... 这是我到目前为止所做的:

divisible(X,Y):-
  0 is X mod Y.
divisible(X,Y):-
  X > Y + 1,
  divisible(X,Y+1).

is_prime(2).
is_prime(3).
is_prime(P):-
  integer(P),
  P>3,
  P mod 2 =\= 0,
  not(divisible(P,3)).

这个从列表中删除素数..

removeP([],[]).
removeP([H],[H]):-
  not(is_prime(H)).
removeP([H|T],[H|L]):-
  not(is_prime(H)),
  removeP(T,L).
removeP([H|T],L):-
  is_prime(H),
  removeP(T,L).

在这里我试图找到最长的序列,但我不知道下一步该做什么

longest([],[]).
longest([H],[H]):-
  is_prime(H).
longest([H],[]):-
  not(in_prime(H)).
longest([H|T],L):-
  ....

【问题讨论】:

  • 请提供一些示例查询以及您期望的答案。
  • 我假设您对子序列不感兴趣,但对子列表感兴趣。 cf en.m.wikipedia.org/wiki/Subsequenceen.m.wikipedia.org/wiki/Substring .
  • 例如,如果我有列表 [1, 3, 5, 4, 2, 5, 7, 8],结果列表将是 [1, 3, 5, 4, 8]因为 [2,5,7] 是最长的。
  • 好的。如果列表是[1,3,5,4, 2,5,7, 8, 2,5,7, 9] 怎么办?是否应该同时删除 [2,5,7] 的出现?
  • 我想应该把它们全部删除..如果大小相同。

标签: list prolog sublist


【解决方案1】:

库,特别是 aggregate,有助于利用不确定性:

remove_longest(Pred, L, R) :-
    aggregate(max(C,Xc/Yc), P^(append([Xc,P,Yc],L), maplist(Pred,P), length(P,C)), max(C,X/Y)),
    append(X, Y, R).

谓词(is_prime 对于您的情况)是通用的。在这个示例运行中,我只使用原子“a”的身份:

?- remove_longest(=(a), [1,2,3,a,a,4,5,a], R).
R = [1, 2, 3, 4, 5, a].

【讨论】:

  • 有趣,这可以做成非二次的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多