2010-12-29 5 views
1

j'ai écrit un programme, qui trouve le plus long coprime-séquence dans une liste Prolog (il est encore parfait):Sortie liste finale du prédicat récursif dans Prolog

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], _, _).  

sortie Actuellement, je la séquence avec le write prédicat, mais je besoin de courir de la façon suivante:

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

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

Quelles modifications dois-je faire, si cela fonctionne?

Répondre

4

Pourquoi voulez-vous utiliser write/1? Concentrez-vous sur une description déclarative claire de ce que vous voulez, et le toplevel fera l'écriture pour vous. Une formulation possible pour une sous-séquence de coprime la plus longue est la suivante: C'est une sous-séquence de premier sous-ensemble, et aucune autre sous-séquence de coprime n'est plus longue. Le code pourrait ressembler à ceci:

list_lcpsubseq(Ls, Subseq) :- 
    list_subseq(Ls, Subseq), 
    coprimes(Subseq), 
    length(Subseq, L), 
    \+ (list_subseq(Ls, Others), coprimes(Others), length(Others, O), O > L). 
+0

l'écriture/1 est une solution temporaire pour déboguer l'algorithme. Le problème avec cette solution (à première vue) est qu'elle ne fonctionnera pas en temps polynominal. – skazhy

+2

Y a-t-il une promesse qu'un algorithme de temps polynomial existe? Il me semble que la sous-séquence coprime de longueur maximale est la plus grande clique d'un graphe sur des noeuds où un bord indique la coprimalité de deux nombres entiers. Le code de mat est clair et correct (avec une implémentation appropriée des prédicats auxiliaires). Si l'efficacité était un objectif réel (ce qui n'est pas toujours le cas avec les devoirs), alors je préférerais commencer par polir la mise en œuvre du tapis plutôt que de polir le vôtre. – hardmath