2015-11-04 5 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]. 
Смежные вопросы