Объединяет списки

Yes

?-

 

divd(L,[],L,1):-!.

divd(L,Lb,La):-divd(L,Lb,La,0).

divd([],[],[],0).

divd([H|L],[H|Lb],La,0):-

H\='.',H\=',',divd(L,Lb,La,0),!.

divd([H|L],[],La,0):-(H='.';H=','),divd(L,_,La,1),!.

 

trimlft([],[]).

trimlft([0|L],L1):-trimlft(L,L1).

trimlft([H|L1],[H|L1]):-H\=0.

 

lst([L],L,[]).

lst([H|L],K,[H|L1]):-lst(L,K,L1),!.

trimrght([],[]).

trimrght(L,L1):-lst(L,E,R),E=0,trimrght(R,L1),!.

trimrght(L,L1):-lst(L,E,R),E\=0,L1=L,!.

 

trns(L,K,N):-int_text(N,N1),trns(L,K,N1),!.

trns([0,0,0,0],_,'0').

trns([0,0,0,1],_,'1').

trns([0,0,1,0],_,'2').

trns([0,0,1,1],_,'3').

trns([0,1,0,0],_,'4').

trns([0,1,0,1],_,'5').

trns([0,1,1,0],_,'6').

trns([0,1,1,1],_,'7').

trns([1,0,0,0],_,'8').

trns([1,0,0,1],_,'9').

trns([1,0,1,0],l,'a').

trns([1,0,1,1],l,'b').

trns([1,1,0,0],l,'c').

trns([1,1,0,1],l,'d').

trns([1,1,1,0],l,'e').

trns([1,1,1,1],l,'f').

trns([1,0,1,0],u,'A').

trns([1,0,1,1],u,'B').

trns([1,1,0,0],u,'C').

trns([1,1,0,1],u,'D').

trns([1,1,1,0],u,'E').

trns([1,1,1,1],u,'F').

 

apnd([],L,L):-!.

apnd([H|L1],L2,[H|L3]):-apnd(L1,L2,L3),!.

 

trns([],_,[]):-!.

trns(L,K,[H|Lst]):-trns(F1,K,H),trns(F2,K,Lst),apnd(F1,F2,L).

 

 

main(I,R):-

divd(I,Bf,Af),trns(Bb,K,Bf),trns(Ab,K,Af),trimlft(Bb,Bt),trimrght(Ab,At),

(Bt=[],Br=[0];Bt\=[],Br=Bt),(At=[],R=Br;At\=[],apnd(Br,['.'],Q),apnd(Q,At,R)),!.

 

 

Задача 4: (17) Удалить из списка элемент с заданным порядковым номером, либо все элементы, порядковые номера которых указаны в списке и могут быть удалены.

?- pred([a,b,c,d,e],4,X).

X = [a,b,c,e]

Yes

?-

 

Удаляет из списка элемент с заданным порядковым номером.

delete([],_,[]).

delete([_|T],1,T).

delete([H|T],K,[H|T1]):-K>1,!,

K1 is K-1,

delete(T,K1,T1).

 

Уменьшает значение элементов списка на еденицу.

des([],[]).

des([A|B],[A1|B1]):-

A1 is A-1,

des(B,B1).

 

pred(List1,[],List1).

pred(List1,[D|L],List2):-

delete(List1,D,List3),

des(L,L1),

pred(List3,L1,List2),!.

 

Задача 5: (33) Строка текста на русском языке содержит «лишние» (подчёркнуты в примере) пробелы. Удалить избыточные пробелы. Также удалить все дублирующиеся буквы, за исключением букв в концах слов.

 

?- pred(’Мы будем рады узнать ваше мнение!’,X).

X = ’Мы будем рады узнать ваше мнение!’

Yes

?-

Name – переводит символы в числа.

pred(Text,X):-name(Text,T),fStr(T,T1,_),name(X,T1).

 

Удаляет дубликаты и пробелы:

fStr([H|[]],[H],[]):-!.

fStr([H|T],[A|B],L):-isSpase(H),fStr(T,[A|B],L),isSpase(A),!.

fStr([H|T],[A|B],L):-fStr(T,[A|B],L),notSpase(L),H =A,!.

fStr([H|T],[H|[A|B]],A):-fStr(T,[A|B],L).

 

Проверяет символ пробел или нет

isSpase(X):-name(' ',[X]).

notSpase(X):-name(' ',[Z]),Z \= X.

 

Задача 6: (48)Необходимо собрать в список имена всех узлов, лежащих на глубинах, содержащихся в заданном списке, и записать после имени каждого узла количество узлов, содержащихся в поддереве, корнем которого он является.

?-pred(a(b(d,e),c(f,g(h,k))),[0,2],X).

X=[ [a,3], [d,0],[e,0],[f,0],[g,0] ]

pred(Tree,N,X):-find(Tree,N,X).

 

find(Tree,[H|[]],X):-findOnLevel(Tree,H,X).

find(Tree,[H|T],X):-find(Tree,T,X1),findOnLevel(Tree,H,X2),f(X2,X1,X).

 

Ищет имена всех узлов лежащих на заданной одной глубине.

findOnLevel(Tree,X,[]):-atomic(Tree),X>0.

findOnLevel(Tree,0,[[Tree,0]]):-atomic(Tree).

findOnLevel(Tree,0,[[H,Z]]):-Tree=..[H,O],count(Tree,Z1),Z is Z1-1.

findOnLevel(Tree,0,[[H,Z]]):-Tree=..[H,L,R],count(Tree,Z1),Z is Z1-1.

findOnLevel(Tree,N,X):-N1 is N-1,Tree=..[H,O],findOnLevel(O,N1,X).

findOnLevel(Tree,N,X):-N1 is N-1,Tree=..[H,L,R],findOnLevel(L,N1,XL),findOnLevel(R,N1,XR),f(XL,XR,X).

 

Считает кол-во узлов в дереве.

count(Tree,0):-atomic(Tree).

count(Tree,X):-Tree=..[H,O],count(O,OX),X is OX+1.

count(Tree,X):-Tree=..[H,L,R],count(L,LX),count(R,RX),X is RX+LX+1.

 

Объединяет списки.

f([],[],[]).

f([H|[]],A,[H|A]):-!.

f([H|T],A,[H|X]):-f(T,A,X).

 

Задача 7: (55)Определить путь между двумя заданными узлами. Если есть несколько узлов с заданными именами, последовательно вывести все пути (перебором).(дерево бинарное).

?- pred(s(f(w(b(u(i,o),v),k),a),t(r,g)),w,r,X).

X = [w,f,s,t,r] ->;

Yes

?- pred(s(f(w(b(u(i,o),v),k),a),t(r,g)),i,o,X).

X = [i,u,o]

Yes

?-

 

pred(Tree,A,B,X):-f(Tree,A,AX),f(Tree,B,BX),split(AX,BX,X).

 

f(Tree,H,[Tree]):-atomic(Tree),H = Tree.

f(Tree,H,[H]):-Tree=..[H,L,R].

f(Tree,A,[H|Y]):-Tree=..[H,L,R],(f(L,A,Y);f(R,A,Y)).

f(Tree,A,[H|Y]):-Tree=..[H,O],f(L,O,Y).

 

% обьединяет два масива в один

append([],A,A).

append([H|[]],A,[H|A]):-!.

append([H|T],A,[H|X]):-append(T,A,X).

 

split([H|[A|T1]],[H|[A|T2]],X):-split([A|T1],[A|T2],X).

split([H|[A|T1]],[H|[B|T2]],X):-B\=A,invert([A|T1],T),append(T,[H|[B|T2]],X).

 

%переписывает список задом на перед

invert([],[]).

invert([H|T],X):-invert(T,Y),addLast(Y,H,X).

 

%добавляет елемент в конец масива

addLast([],B,[B]).

addLast([H|T],B,[H|X]):-addLast(T,B,X).

 

Задача 8: (75) Необходимо «обрезать» дерево (произвольное) на заданной глубине.

?- pred(s(f(b(m,k),a),t(a,g),j(u)),2,X).

X = s(f,t,j)

Yes

?- pred(s(f(b(m,k),a),t(a,g),j(u)),3,X).

X = s(f(b,a),t(a,g),j(u))

Yes

?-

 

pred(Tree,B,X):-f(Tree,B,X).

 

f(Tree,N,Tree):-atomic(Tree),!.

f(Tree,1,H):-Tree=..[H|N],!.

f(Tree,N,X):-Tree=..[H|T],M is N -1,q(T,M,Y),X=..[H|Y].

 

q([H|[]],N,[X]):-f(H,N,X).

q([H|T],N,[X|Y]):-q(T,N,Y),f(H,N,X).

 

Задача 9: (84) Перебор путей от корня до всех листьев(произвольное дерево).

 

?- pred(a(f(a(m,k),r),n(i,o,v(x))),X).

X = [a,f,a,m] -> ;

X = [a,f,a,k] ->;

X = [a,f,r] -> ;

X = [a,n,i] -> ;

X = [a,n,o] -> ;

X = [a,n,v,x] -> ;

No

?-

 

 

pred(Tree,X):-scan(Tree,X,L).

scan(Tree,[Tree]):-atomic(Tree).

scan(Tree,[H|P]):-Tree=..[H|T],sc(T,P).

 

sc([H|T],A):-scan(H,A).

sc([H|T],A):-sc(T,A).

 

Задача 10: Подсчитать кол-во листьев в дереве.(произвольное дерево).

?- leaf_N(a(f(a(m,k),r),n(i,o,v(x))),X).

X = 6

Yes

?-

 

leaf_N(Tree,1):- atomic(Tree),!.

leaf_N(Tree,R):-

Tree=..[Name,SubTree],

leaf_N(SubTree,R),!.

leaf_N(Tree,R):-

Tree=..[Name,Left|Tail],

New=..[Name|Tail],

leaf_N(Left,R1),

leaf_N(New,R2),

R is R1+R2,!.

 

Задача 11: Дан список, содержащий списки одинаковой длины (матрица). Вернуть матрицу, являющуюся произведением данной матрицы на транспонированную..

?- pred([[1,2,3],[4,5,6],[7,8,9]],X).

X = [[1,4,7],[2,5,8],[3,6,9]]

Yes

?-

 

pred([H|T],X):-transporate([],[H|T],X).

 

transporate(A,[H|[]],X):-strToCol(A,H,X).

transporate(A,[H|T],X):-strToCol(A,H,Z),transporate(Z,T,X).

 

strToCol([],[A|[]],[H1]):-addLast([],A,H1).

strToCol([H|[]],[A|[]],[H1]):-addLast(H,A,H1).

strToCol([],[A|B],[H1|T1]):-addLast([],A,H1),strToCol([],B,T1).

strToCol([H|T],[A|B],[H1|T1]):-addLast(H,A,H1),strToCol(T,B,T1).

 

addLast([],B,[B]).

addLast([H|T],B,[H|X]):-addLast(T,B,X).

 

 

Задача 12: Дан список, содержащий списки одинаковой длины (квадратная матрица). Посчитать детерминант.

?- pred([[1,2],[4,5]],X).

X = -3

Yes

?-

 

pred([[X11,X12],[X21,X22]],X):-X is X11*X22-X12*X21,!.

если матрица 2х2 то ищем её детерминант как разность произведений

и отбрасываем все остальные попытки посчитать эту матрицу.

 

pred([A|B],X):-pr(A,B,1,1,X).

если матрица не 2х2 то выполняем вспомогательную рекурсивную

функцию "pr"

этой функции передаем первую строчку и остальную матрицу как параметры

и дополнительные парметры

эта функция вернет детерминант матрицы

 

pr([A|[]],C,Y,K,X):-g(C,Y,F),pred(F,Z),X is Z*A*K,!.

если "А" последний элемент то "Х" будет равен произведению

детерминанта дополнительной матрицы на "А"

и остальные попытки обработать этот вариант отбрасываем

 

pr([A|B],C,Y,K,D):-g(C,Y,F),pred(F,Z),pr(B,C,Y+1,K*(-1),X),D is Z*A*K+X.

если "А" не последний элемент

получаем из матрици вспомогательную матрицу(F) путем зачеркивания первой

строки и столбц под номером "Y", найдем её придекат(Z) умножив его на "А" и прибавим его

к сумме остальных такихже призведений, полученых зачеркиванием разных столбцов.

причем каждый второй детерминант домножается на -1

 

g([A|[]],Y,[Q]):-f(A,Y,Q),!.

если это последняя строчка в матрице то уделяем из нее элемент под номером "Y"

и отбрасываем все остальные попытки обработать этот вариант

после этой строчки все предыдущие строки с удоленным элементом собираются в матрицу

 

g([A|B],Y,[Q|H]):-f(A,Y,Q),g(B,Y,H).

если это непоследняя строчка в матрице то берем первую строчку и удоляем

из неё элемент с №"Y",затем выполняем этуже ф-ию с матрицей без этой строчки

 

f([A|T],1,T):-!.

если встречаем 1 то возвращяется хвост строик, и отбрасываем другие варианты

f([A|T],Y,[A|F]):-E is Y-1,f(T,E,F).

если значение "Y" больше 1 то выполняем этуже функцию без первого элемента

по завершению все первые елементы и остаток собираются в строчку без одного элемента

 

pred([[X11,X12],[X21,X22]],X):-X is X11*X22-X12*X21,!.

pred([A|B],X):-pr(A,B,1,1,X).

pr([A|[]],C,Y,K,X):-g(C,Y,F),pred(F,Z),X is Z*A*K,!.

pr([A|B],C,Y,K,D):-g(C,Y,F),pred(F,Z),pr(B,C,Y+1,K*(-1),X),D is Z*A*K+X.

g([A|[]],Y,[Q]):-f(A,Y,Q),!.

g([A|B],Y,[Q|H]):-f(A,Y,Q),g(B,Y,H).

f([A|T],1,T):-!.

f([A|T],Y,[A|F]):-E is Y-1,f(T,E,F).

 

Задача 13: Собирает в список кол-во узлов лежащих на каждом уровне.(дерево бинарное).

?- pred(a(b(d(h,k),e(l(n,o),m)),c(f,g(r,p))),X).

X=[1,2,4,6,2]à

Yes

?-

pred(Tree,X):-getMaxLen(Tree,ML),findOnAllLevels(Tree,ML,[],X).

 

findOnAllLevels(Tree,0,A,A):-!.

findOnAllLevels(Tree,ML,A,X):-getCountOnLevel(Tree,ML,C),N is ML-1,findOnAllLevels(Tree,N,[C|A],X).

 

getCountOnLevel(Tree,1,1):-!.

getCountOnLevel(Tree,N,0):-atomic(Tree),N>=1.

getCountOnLevel(Tree,N,X):-Tree=..[H,O],M is N-1,getCountOnLevel(O,M,X).

getCountOnLevel(Tree,N,X):-Tree=..[H,L,R],M is N-1,getCountOnLevel(L,M,LX),getCountOnLevel(R,M,RX),X is RX+LX.

 

getMaxLen(Tree,1):-atomic(Tree).

getMaxLen(Tree,X):-Tree=..[H,O],getMaxLen(O,OX),X is OX+1.

getMaxLen(Tree,X):-Tree=..[H,L,R],getMaxLen(L,LX),getMaxLen(R,RX),ifthenelse(LX>RX,X is LX+1,X is RX+1).

Задача 14: Все возможные пары элементов списка.

?- pred([a,b,c,d,e],X).

X = [a,b] -> ;

X = [a,c] -> ;

X = [a,d] -> ;

X = [a,e] -> ;

X = [b,c] -> ;

X = [b,d] -> ;

X = [b,e] -> ;

X = [c,d] -> ;

X = [c,e] -> ;

X = [d,e] -> ;

No

?-

pred([H|T],[A,B]):-any([H|T],A,T1),any(T1,B,T2).

 

any([H|T],H,T).

any([H|T],X,Y):-any(T,X,Y).

 

Задача 15: (78) Подсчитать количество узлов дерева лежащих на заданной глубине.(произвольное дерево).

?- pred(s(f(b(m,k),a),t(a)),1,X).

X = 1

Yes

?- pred(s(f(b(m,k),a),t(a)),3,X).

X = 3

Yes

?- pred(s(f(b(m,k),a),t(a)),4,X).

X = 2

Yes

?-

 

pred(A,N,X):-f(A,N,X).

 

f(Tree,1,1):-!.

f(Tree,N,0):-atomic(Tree),!.

f(Tree,N,X):-M is N-1,Tree=..[H|T],a(T,M,X).

 

a([H|[]],N,X):-f(H,N,X).

a([H|T],N,X):-a(T,N,Y),f(H,N,Z),X is Z+Y.