Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


ќбъедин€ет списки

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.



<== предыдуща€ лекци€ | следующа€ лекци€ ==>
 | ’од выполнени€ работы
ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2015-10-01; ћы поможем в написании ваших работ!; просмотров: 367 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

≈сть только один способ избежать критики: ничего не делайте, ничего не говорите и будьте никем. © јристотель
==> читать все изречени€...

1361 - | 1314 -


© 2015-2024 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.05 с.