Last active
February 14, 2022 17:12
-
-
Save mrsolarius/054b8e6327f097a4a2a72560c27a7b04 to your computer and use it in GitHub Desktop.
Comment crée en Prolog une fonction qui vérifie qu'une liste est un palindrome ?
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
%% % % % % % % % % % % % % % % % % % % % % % % % % | |
%% Topic : Implementation d'une fonction de palindrom en prolog | |
%% -> Note : Un palindome et une liste inversable. | |
%% % % % % % % % % % % % % % % % % % % % % % % % % | |
%% % % % % % % % % % % % % % % % % % % % % % % % % | |
%% Spéc | |
%% pal() et vrais ssi L est une liste palindrome. | |
%% la liste L1 | |
%% | |
%% Ex : | |
%% ?-pal([1,2,3,2,1]) | |
%% vrai | |
%% | |
%% ?-pal([1,2,3,4,5]) | |
%% faux | |
%% | |
%% pal(L) vrai ssi l'inverse e L est L | |
%% ==> pal(L):- inv(L,L). %r | |
%% | |
%% Ou inv/2 est spécifier ainsi : | |
%% | |
%% | |
%% Spec | |
%% | |
%% | ^ | |
%% v | | |
%% inv(L1,L2) vrai ssi L2 est l'inverse de L1 | |
%% | |
%% Ex : ?-inv([1,2,3],L2). | |
%% L2 = [3,2,1] | |
%% | |
%% Realisation | |
%% Analyse sur L1 : 2 cas | |
%% | |
%% a) L1 = [] | |
%% A Quelle condition a-t-on inv([],L2 ? A La condition que L2 = []. | |
%% -> inv([],[]). %r1 | |
%% | |
%% liste | |
%% b) L1 != [] | |
%% b) L1 != []. L1=[Pr|Fin] | |
%% A quelle condition a-t-on inv([Pr|Fin],L2) ? | |
%% | |
%% Inversion | |
%% FIN (Appel Récursive) | |
%% [PR|---------------] =======> [---------------|PR] | |
%% |_____________|^ | |
%% | | | |
%% | append/3 | |
%% noté L | |
%% | |
%% L1 = [Pr|Fin] | |
%% -> inv([Pr|Fin],L2):- | |
%% inv(Fin,L), append(L,[Pr], L2). %r3 | |
%% | |
%% constat la complexité est importante dans se cas. | |
%% | |
%% Question : Peut on écrire une réalisation de inv/2 sans append, | |
%% ni aucun autre prédicat auxilliaire ? | |
%% --> Oui | |
%% | |
%% | L1 | Acc | L2 | | |
%%---|---------|---------|---------| | |
%% 0 | [1,2,3] | [] | | | |
%% 1 | [2,3] | [1] | | | |
%% 2 | [3] | [2,1] | | | |
%% 3 | [] | [3,2,1] | [3,2,1] | | |
%% | |
%% % % % % % % % % % % % % % % % % % % % % % % % % | |
inv(L1,L2):- inv(L1,[],L2). | |
inv([],Acc,Acc). | |
inv([Pr|Fin],Acc,L2):-inv(Fin,[Pr|Acc],L2). | |
palindrome(L):- inv(L,L). |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment