Παραδείγματα
Παρακάτω δίνονται παραδείγματα διαδικασιών με λίστες.
Διάσχιση λίστας με χρήση οπισθοδρόμησης (backtracking).
get_next(X,List):- member(X,List).
?- get_next(X, [1,3,6,b(123)]).
X = 1 ;
X = 3 ;
X = 6 ;
X = b(123) ;
No
Διάσχιση λίστας με χρήση αναδρομικού κανόνα.
get_next([]).
get_next([X|Tail]):- writeln(X), get_next(Tail).
?- get_next([a,f(5),[1,2],b]).
a
f(5)
[1,2]
b
Yes
Αντιγραφή όλων των στοιχείων μίας λίστας που είναι μεγαλύτερα από έναν αριθμό σε μία άλλη λίστα.
copy_list(_,[],[]).
copy_list(X, [Y|List], [Y|NewList]):- Y>X, copy_list(X,List,NewList).
copy_list(X, [Y|List], NewList):- Y<=X, copy_list(X,List,NewList).
?- copy_list(2,[1,3,6,0,8],L).
L = [3, 6, 8] ;
No
Δύο λίστες έχουν το ίδιο πλήθος στοιχείων.
plithos([],[]).
plithos([_|L1], [_|L2]) :- plithos(L1,L2).
?- plithos([1,2,3,4],[a,b,c,d]).
Yes
Όλα τα στοιχεία μίας λίστα είναι ίδια.
repeated([X]).
repeated([X,X|List]) :- repeated([X|List]).
?- repeated([a,a,a,a,a]).
Yes
Πρώτο και τελευταίο στοιχείο μίας λίστας.
first_element(X,[X|_List]).
%Πρώτος τρόπος υλοποίησης της last_element/2 (αναδρομικός τρόπος).
last_element(X,[X]).
last_element(X,[_|L]) :- last_element(X,L).
%Δεύτερος τρόπος υλοποίησης της last_element/2 (με χρήση της conca/3).
last_element1(X, L) :- conca(_L1,[X],L).
?- first_element(X,[a,b,c,d]).
X=a
Yes
?- last_element(X,[a,b,c,d]).
X=d
Yes
Πρώτο και τελευταίο μέρος μίας λίστας.
first_segment([], _L).
first_segment([X|L1], [X|L2]):- first_segment(L1, L2).
last_segment(L1,L2):- reverse(L1,R1), reverse(L2,R2), first_segment(R1,R2).
?- first_segment([a,b],[a,b,c,d]).
Yes
?- last_segment([c,d],[a,b,c,d]).
Yes
Διπλασιασμός των στοιχείων μίας λίστας.
double([A], [A,A]).
double([A|L], [A,A|L1] ) :- double(L, L1 ).
?- double([a,b,c], [a,a,b,b,c,c]).
Yes
?- double([a,b,c], List).
List = [a,a,b,b,c,c]
Yes
Mία λίστα είναι συμμετρική.
symmetric(L) :- reverse(L,L).
?- symmetric([a,b,c,b,a]).
Yes
Mέγιστο στοιχείο μίας λίστας.
max([N|RestList], Max) :-
max(RestList, M),
max(N,M, Max).
max(Max,M, Max):- Max >= M.
max(M,Max, Max):- Max < M.
?- max([1,3,5,2,1],Max).
Max = 5
Υλοποίηση των διαδικασιών push/3 και pop/3 μιας ουράς στοιχείων.
push(X,List,[X|List]).
pop(X,[X],[]).
pop(X,[Y|List],[Y|NewList]):- pop(X,List, NewList).
?- push(0,[1,2,3,4],List).
List = [0,1,2,3,4]
Yes
?- pop(X,[1,2,3,4,5],List).
X = 5
List = [1,2,3,4]
Yes
Υπό-λίστα μίας λίστας.
%Πρώτος τρόπος υλοποίησης με χρήση της concat/3.
sublist1(L1,L2):- concat(Y,_,L2), concat(_,L1,Y).
%Δεύτερος τρόπος υλοποίησης με χρήση αναδρομικού κανόνα.
sublist([X],[X|_]).
sublist([X|L1], [Y|L2]):- X\==Y, sublist([X|L1], L2).
sublist([X|L1], [Y|L2]):- X=Y, sublist(L1, L2).
?- sublist([2,3],[1,2,3,4]).
Yes
?- sublist(SubList,[1,2,3,4]).
SubList = [1] ;
SubList = [2] ;
SubList = [3] ;
SubList = [2, 3] ;
SubList = [1, 2] ;
SubList = [1, 3] ;
SubList = [1, 2, 3] ;
No
Αντιγραφή μίας λίστας σε μία άλλη εκτός ενός στοιχείου της.
except([A|L],A,L).
except([B|L],A,[B|L1]):- A\=B, except(L,A,L1).
except([B|L],A,L1):- A==B, except(L,A,L1).
?- except([1,2,3,4,5],3,L).
L = [1, 2, 4, 5]
Yes
Υποσύνολο ενός συνόλου.
subset([],_).
subset([A|X],L):-
member(A, L),
except(L, A, L1),
subset(X, L1).
?- subset([2,4,5],[1,2,3,4,5,6]).
Yes
?- subset(X,[1,2,3]).
X = [] ;
X = [1] ;
X = [1, 2] ;
X = [1, 2, 3] ;
X = [1, 3] ;
X = [1, 3, 2] ;
X = [2] ;
X = [2, 1] ;
X = [2, 1, 3] ;
X = [2, 3] ;
X = [2, 3, 1] ;
X = [3] ;
X = [3, 1] ;
X = [3, 1, 2] ;
X = [3, 2] ;
X = [3, 2, 1] ;
No
Τομή δύο συνόλων.
intersection([],_,[]).
intersection([X|L1],L2,[X|L]):- member(X,L2), intersection(L1,L2,L).
intersection([X|L1],L2,L):- not(member(X,L2)), intersection(L1,L2,L).
?- intersection([1,2,3,4,5],[a,3,b,5,4,c],L).
L = [3, 4, 5]
Yes
Τελευταία ενημέρωση σελίδας: 10/12/2007 |
|