'Added Prolog lists small excercises;'

This commit is contained in:
Arkadiusz Hypki 2025-03-31 13:03:22 +02:00
parent 773b4b5287
commit a3678c44b3
2 changed files with 98 additions and 0 deletions
04_Prolog/in_class

View File

@ -0,0 +1,49 @@
L2 podstawia się lista będąca odwróceniem listy L1:
?- L1 = [1, 2, 3, 4], L1 = [A, B, C, D], L2 = [D, C, B, A].
Najważniejsze z nich to:
member(X, L) spełniony, gdy X jest elementem listy L;
append(L1, L2, L3) spełniony, gdy lista L3 jest połączeniem list L1 i L2;
select(X, L1, L2) spełniony, gdy lista L2 jest listą pozostałą z listy L1 po wyjęciu z niej elementu X.
?- member(X, [a, b, c]).
X = a ;
X = b ;
X = c.
?- append([1, 2], [3, 4, 5], X).
X = [1, 2, 3, 4, 5].
?- append(X, Y, [a, b, c]).
Podobnie predykat select może wyjmować elementy z listy ale i wkładać je do listy:
?- select(X, [1, 2, 3], L).
?- select(a, L, [1, 2]).
definicje takich uniwersalnych predykatów w Prologu krótkie i proste do zrozumienia:
member(X, [X | _]).
member(X, [_ | Y]) :- member(X, Y).
append([], X, X).
append([X | Y1], Y2, [X | Z]) :- append(Y1, Y2, Z).
select(X, [X | Y], Y).
select(X, [Y | Z1], [Y | Z2]) :- select(X, Z1, Z2).
Powyższe klauzule formalnie zapisanymi definicjami jakie możemy wyrazić następująco w języku polskim:
* X jest elementem listy o głowie X oraz jeśli X jest elementem listy Y, to X jest elementem listy o ogonie Y;
* połączeniem listy pustej z dowolną listą X jest lista X oraz jeśli Z jest połączeniem list Y1 i Y2, to lista o głowie X i ogonie Z jest połączeniem listy o głowie X i ogonie Y1 z listą Y2;
* po wyjęciu elementu z listy o głowie X i ogonie Y pozostaje lista Y oraz jeśli lista Z2 powstaje z listy Z1 przez wyjęcie elementu X, to lista o głowie Y i ogonie Z2 powstaje z listy o głowie Y i ogonie Z1 przez wyjęcie z niej elementu X.

View File

@ -0,0 +1,49 @@
list_length([], 0).
list_length([_ | L], N) :-
list_length(L, N1),
N is N1 + 1.
%?- list_length([hello, world], NL).
list_member(X,[X|_]).
list_member(X,[_|TAIL]) :- list_member(X,TAIL).
%?- list_member(hello, [hello, world]).
list_concat([],L,L).
list_concat([X1|L1],L2,[X1|L3]) :- list_concat(L1,L2,L3).
%?- list_concat(ala, [ma, kota], L).
%?- list_concat([ala], [ma, kota], L).
list_delete(X, [X], []).
list_delete(X, [X|L1], L1).
list_delete(X, [Y|L2], [Y|L1]) :- list_delete(X,L2,L1).
%?- list_delete(a, [h, s, g, a, d, t], L).
%list_member(X,[X|_]).
%list_member(X,[_|TAIL]) :- list_member(X,TAIL).
list_append(A,T,T) :- list_member(A,T),!.
list_append(A,T,[A|T]).
%?- list_delete(z, [h, s, g, a, d, t], L).
%?- list_delete(z, [h, s, g, a, d, t], L).
% insert into every position
%list_delete(X, [X], []).
%list_delete(X,[X|L1], L1).
%list_delete(X, [Y|L2], [Y|L1]) :- list_delete(X,L2,L1).
list_insert(X,L,R) :- list_delete(X,R,L).
%?- list_insert(a, [b, c, d], L).
%list_delete(X,[X|L1], L1).
%list_delete(X, [Y|L2], [Y|L1]) :- list_delete(X,L2,L1).
list_perm([],[]).
list_perm(L,[X|P]) :- list_delete(X,L,L1),list_perm(L1,P).
%?- list_perm([a, b, c], L).
%list_concat([],L,L).
%list_concat([X1|L1],L2,[X1|L3]) :- list_concat(L1,L2,L3).
list_rev([],[]).
list_rev([Head|Tail],Reversed) :- list_rev(Tail, RevTail),list_concat(RevTail, [Head],Reversed).
%?- list_rev([a, b, c], L).