Програмен код на Prolog
Задача – премахване на последните нечетни елементи на Prolog
Публикувано от Ivelin Pavlov в Prolog Код, Код на 06 април 2012г.
Предикат 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 – сума на елементи на списък
Публикувано от Ivelin Pavlov в Prolog Код, Код на 06 април 2012г.
Сумата на елементи в списък на Пролог.
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 – съединяване на два списъка и обръщане в обратен ред
Публикувано от Ivelin Pavlov в Prolog Код, Код на 06 април 2012г.
Обръщане на елементите на списък в обратен ред – 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 – начало, край на списък
Публикувано от Ivelin Pavlov в Prolog Код, Код на 06 април 2012г.
Начален (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).
Prolog – insert – вмъкване на елемент в списък
Публикувано от Ivelin Pavlov в Prolog Код, Код на 06 април 2012г.
Вмъкване на елемент към началото на списък на Пролог. Върви и само с първия ред.
Вторият ред се използва за разпознаване дали елемент е вкаран в списък (като member).
insert(X,L,[X|L]). insert(X,[Y|L1],[Y|L2]):- insert(X,L1,L2). ?- insert(z,[a,b,c,d],I). % z,a,b,c,d
Лесно може да се преработи да вкарва член на определена позиция в списъка, или след определен член.
На определена позиция:
insert(X,1,L,[X|L]). insert(X,N,[Y|L1],[Y|L2]):- N1 is N-1, insert(X,N1,L1,L2). ?- insert(z,3,[a,b,c,d],N),write(N). %[a,b,z,c,d]
След определен член
insert(X,[],L,[X|L]). insert(X,Y,[Y|L1],[Y|L2]):- insert(X,[],L1,L2). insert(X,Z,[Y|L1],[Y|L2]):- insert(X,Z,L1,L2). ?- insert(z,b,[a,b,c,d],N),write(N). %[a,b,z,c,d]
#1 by Алекс on 05.04.2024 - 7:40
Здравей,
Имам две задачи – едната на PROLOG, а другата на LISP,. Въпроса ми е мога ли да ти ги изпратя да ги погледнеш?
#2 by Ivelin Pavlov on 30.05.2024 - 10:04
Може да, скоро не съм работил с тях, но може да пробваме