Prolog – Arithmetic progression – Проверка за аритметическа прогресия

Програма за проверка, дали елементите на даден списък образуват аритметическа прогресия на Пролог.\

aritmethmeticProgression([X,Y|[]],D):- D =:= Y-X.
aritmethmeticProgression([X,Y|L],D):- D =:= Y-X, aritmethmeticProgression([Y|L],D).
arithProgression([X,Y|[]]).
arithProgression([X,Y|L]) :-D is Y-X, ar([Y|L],D).
?-arithProgression([1,2,3,4,5])

или по-просто

aritm([X,Y]).
aritm([X,Y|[Y1|S]]):-aritm([Y,Y1|S]), X-Y=:=Y-Y1.

чрез сума на елементите на списък може да намерим, по даден списък от списъци от числа, дали неговите суми на списъци, дали образуват аритметична прогресия.
Това е задача от контролно по „Логическо Програмиране“, във ФМИ на СУ:
Да се дефинира на пролог предикат p(X), който по даден списък X = [X1,…,Xn] от списъци от числа (където n може да бъде 0) проверява дали сумите на елементите на елементите на X (общо n на брой) образуват аритметична прогресия.

ar([X,Y|[]],D):-sum(Y,SY),sum(X,SX), D =:= SY-SX.
ar([X,Y|L],D):-sum(Y,SY),sum(X,SX), D =:= SY-SX, ar([Y|L],D).
a([X,Y]).
a([X,Y|L]) :-sum(Y,SY),sum(X,SX),D is SY-SX, ar([Y|L],D).

sum([],0).
sum([X|L],N1):-sum(L,N), N1 is N+X.
?-a([[1,2,3],[1,2,3,4],[1,2,3,4,4],[1,2,3,4,4,4],[1,2,3]]).

Втори начин:

p(X):-spspSum(X,L),aritm(L).
?-p([[1,2,3],[1,2,3,4],[1,2,3,4,4],[1,2,3,4,4,4]]).

spspSum([],[]).
spspSum([X|L],[S|Y]):-spspSum(L,Y),sum(X,S).
%?-spspSum([[1,2,3,4,5],[1,2],[2,5,7]],N),write(N).

aritm([X,Y]).
aritm([X,Y|[Y1|S]]):-aritm([Y,Y1|S]), X-Y=:=Y-Y1.

sum([],0).
sum([X|L],N1):-sum(L,N), N1 is N+X.
%?-a([[1,2,3],[1,2,3,4],[1,2,3,4,4],[1,2,3,4,4,4],[1,2,3]]).

Няма коментари

Задача – премахване на последните нечетни елементи на Prolog

Предикат p(I,L1,L2) на Пролог, който по дадено естествено число I и списък от числа L1, връща в L2, списък получен от L1, след премахване на всички нечетни числа след последните I елемента на L1.
Или ако I = 3, L1 = [1,2,3,4,5], L2 трябва да върне [1,2,4].

p(I,L1,L2):-reverse(L1,L3),delete(I,L3,L4),reverse(L4,L2).
reverse([],[]).
reverse([X|L1],L2):-reverse(L1,L3),append(L3,[X],L2).
append([],L,L).
append([X|L1],L2,[X|L3]):-append(L1,L2,L3).
delete(0,L,L).
delete(I,[X|L],[X|L2]):- I>0, X mod 2 =:= 0,I1 is I-1, delete(I1,L,L2).
delete(I,[X|L],L2):- I>0, X mod 2 =:= 1, I1 is I-1, delete(I1,L,L2).
?- p(3,[1,2,3,4,5,6,7,8,9,10],X),write(X),nl.
% X = [1,2,3,4,5,6,7,8,10]

Няма коментари

Prolog – sum – сума на елементи на списък

Сумата на елементи в списък на Пролог.

sumlist([],0).
sumlist([X|L],S1):-sumlist(L,S), S1 is X+S. 
?-sumlist([1,5,2,5,6],S),write(S).

Произведението на елементи в списък на Пролог.

multiplylist([],1).
multiplylist([X|L],S1):-multiplylist(L,S), S1 is X*S.
?-multiplylist([1,5,2,3],S),write(S).

Няма коментари

Prolog – Append, reverse – съединяване на два списъка и обръщане в обратен ред

Обръщане на елементите на списък в обратен ред – reverse. Конкатиниране (съединяване) на два списъка на Пролог – append

reverse([],[]).
reverse([X|L1],L):- reverse(L1,L2), append(L2,[X],L).
append([],L,L).
append([X|L1],L2,[X|L3]):- append(L1,L2,L3).
% ?- append([a,b,c,d],[1,2,3],L).
% L = [a,b,c,d,1,2,3].
?-reverse([a,b,c,d,e],L2).
% L = [e,d,c,b,a]

Няма коментари

Prolog – Prefix, Suffix – начало, край на списък

Начален (prefix) списък от елементи на списък – на Пролог

prefix([],L).
prefix([X|L1],[X|L2]):- prefix(L1,L2).
?- prefix([a,b,c,d,f],X).
%a,b,c,d,f
?- prefix([a,b,c],[a,b,c,d,f]).
%yes

Списък завършващ на друг списък (suffix)

suffix(L,L).
suffix(L1,[_|L2]):- suffix(L1,L2).
?- suffix([c,d,f],[a,b,c,d,f]).
%yes

Можете да проверите дали даден списък е начален или краен на някой.

sublist(L1,L2):-prefix(L3,L2),suffix(L1,L3).

Няма коментари

  • Страница 8 от 9
  • <
  • 1
  • ...
  • 6
  • 7
  • 8
  • 9
  • >