Skip to content

Instantly share code, notes, and snippets.

@mrsolarius
Last active February 14, 2022 17:12
Show Gist options
  • Save mrsolarius/054b8e6327f097a4a2a72560c27a7b04 to your computer and use it in GitHub Desktop.
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 ?
%% % % % % % % % % % % % % % % % % % % % % % % % %
%% 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