Вывод окончательного списка из рекурсивного предиката в Прологе - PullRequest
1 голос
/ 29 декабря 2010

Я написал программу, которая находит самую длинную простейшую подпоследовательность в списке Пролога (она не пока идеально):

longest_lcs([A, B | Tail],X) :- gcd(A,B,1),lcs([B | Tail],X,A,1).
longest_lcs([A, B | Tail],X) :- lcs([B | Tail],X,A,0).

lcs([],G,_,_) :- rev(G,G1),write(G1).

lcs([A, B | Tail],G,Q,_) :- gcd(B,Q,1), gcd(A,B,1), lcs([B | Tail], [Q | G], A, 1),!.
lcs([A, B | Tail],G,Q,_) :- gcd(B,Q,1);gcd(A,B,1), lcs([B | Tail], [Q | G], A, 0).

lcs([A, B | Tail],G,_,0) :- gcd(A,B,1), lcs([B | Tail], G, A, 1).
lcs([A, B | Tail],G,_,1) :- lcs([B | Tail], G, A, 1).
lcs([A, B | Tail],G,_,0) :- lcs([B | Tail], G, A, 0).

lcs([A],G,Q,_) :- gcd(Q,A,1),lcs([], [A, Q | G], _, _).    

В настоящее время я вывожу подпоследовательность с предикатом write, но мне нужно, чтобы он выполнялся следующим образом:

?- longest_lcs([1,2,3,4],X).
X = [1,2,3,4]

?- longest_lcs([2,4,8,16],X).
X = []

Какие модификации мне нужно сделать, чтобы это работало?

1 Ответ

4 голосов
/ 29 декабря 2010

Почему вы хотите использовать write / 1?Сосредоточьтесь на четком декларативном описании того, что вы хотите, и на высшем уровне будет писать для вас.Возможная формулировка для самой длинной подпоследовательности взаимных простейших выражений такова: это подпоследовательность взаимных простейших, и никакая другая подпоследовательность взаимных простых не является более длинной.Код может выглядеть примерно так:

list_lcpsubseq(Ls, Subseq) :-
    list_subseq(Ls, Subseq),
    coprimes(Subseq),
    length(Subseq, L),
    \+ ( list_subseq(Ls, Others), coprimes(Others), length(Others, O), O > L ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...