2015-11-04 24 views
4

我必須從序言中的列表中刪除最長的素數序列。 我在序言是新的,我不能找到一種方式來獲得的最長序列...... 這裏是我做了什麼至今:序言中的最長序列

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):- 
    .... 
+1

請提供一些示例查詢以及您期望的答案。 – repeat

+1

我假設你對子序列不感興趣,但是在子列表中。 cf https://en.m.wikipedia.org/wiki/Subsequence vs https://en.m.wikipedia.org/wiki/Substring。 – repeat

+1

舉例來說,如果我有[1,3,5,4,2,5,7,8]的列表,結果列表將是[1,3,5,4,8]爲[2,5,7 ]是最長的。 – LauraW

回答

0

庫,專門aggregate,幫助哈rness確定性:

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].