Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


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

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; Мы поможем в написании ваших работ!; просмотров: 391 | Нарушение авторских прав


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

Лучшие изречения:

Так просто быть добрым - нужно только представить себя на месте другого человека прежде, чем начать его судить. © Марлен Дитрих
==> читать все изречения...

2695 - | 2450 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.013 с.