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?
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
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