PL

PL


% 1. Напишіть предикат, який перетворює вихідний список у список позицій від'ємних елементів.
% task1([-2, 1, 0, -4, -1], Res).
% Res = [0,3,4]

task1(List, R) :-neg_indices(List, [], 0, IL), reverse_list(IL, RL), RL=R.

neg_indices([], IL, _, IL) :-!.
neg_indices([X|XS], IL, Ind, R) :- X < 0, Ind1 is Ind + 1, neg_indices(XS, [Ind|IL], Ind1, R).
neg_indices([X|XS], IL, Ind, R) :- X >= 0, Ind1 is Ind + 1, neg_indices(XS, IL, Ind1, R).

reverse_list(List, R) :- reverse_list_h(List, [], R).
reverse_list_h([], R, R) :- !.
reverse_list_h([X|XS], RL, R) :- reverse_list_h(XS, [X|RL], R).

% 2. Напишіть предикат, що замінює всі входження заданого елемента на символ change_dones.
% task2(2, [2, 1, 2, -4, -1], Res).
% Res = [change_dones,1,change_dones,-4,-1]

task2(S, List, R) :-replace_elem(S, List, [], Res), reverse_list(Res, RL), RL=R.
replace_elem(_, [], R, R) :-!.
replace_elem(S, [X|XS], XSL, R) :-X=S, replace_elem(S, XS, ['change_dones'|XSL], R).
replace_elem(S, [X|XS], XSL, R) :-X\=S, replace_elem(S, XS, [X|XSL], R).

% 3. Напишіть предикат, що перетворює будь-який список арабських чисел (від 1 до 50) у список відповідних їм римських чисел.
% task3([1, 12, 57, 123, 567, 999, 1000], Res).
% Res = ["I", "XII", "LVII", "CXXIII", "DLXVII", "CMXCIX", "M"]

% 4. Напишіть предикат, що здійснює циклічний зсув елементів списку на один вправо.
% task4([1,2,3,4], Res).
% Res = [4,1,2,3]
shift([], []) :- !.
shift(List, R) :- last_elem(List, Last), up_to_last(List, UpToLast), append([Last|[]], UpToLast, R).

last_elem([X|[]], X).
last_elem([_|XS], R) :- last_elem(XS, R).

up_to_last([X|Xs], R) :- up_to_last_prev(Xs, R, X).         

up_to_last_prev([], [], _).
up_to_last_prev([X|XS], [X0|Ys], X0) :- up_to_last_prev(XS, Ys, X). 


% 5. Напишіть предикат, що реалізує множення матриці (список списків) на вектор.
% task5([[1,2],[3,4]],[1,1], R).
% R = [3,7]

task5([], _, []).  
task5([A|AS], V, [R|RS])  :- vec_mult(A, V, Res1), sumArr(Res1, R), task5(AS, V, RS), !.

% множення векторів
vec_mult([A], [V], [R])  :- R is A * V.
vec_mult([A|AS], [V|VS], [R|RS])  :- R is A * V, vec_mult(AS, VS, RS).

sumArr([], 0)  :- !.
sumArr(A, R)  :- sumArr(A, 0, R).
sumArr([], I, R)  :- R is I, !.
sumArr([X|X1], I, R)  :- I1 is I + X, sumArr(X1, I1, R). 


Report Page