house(первый, _, _, _, _, _)

advertisement
Министерство образования и науки РФ
Федеральное агенство по образованию РФ
Государственное образовательное учреждение высшего профессионального образования
Самарский государственный архитектурно-строительный университет
Прохорова О.В.
Практикум_2 на языке Пролог
2014 г.
Оглавление
1. Написание программы на языке Prolog заменяющей все четные элементы списка из
списка вещественных чисел на произвольную константу................................................................ 2
2.
Для двух строк символов создать новую строку путем посимвольной конкатенации ....... 3
3.
Реализация алгоритма быстрой сортировки на языке LISP ..... Error! Bookmark not defined.
4. Написание программы на языке Лисп, которая вычисляет сумму факториалов чисел от
1 до n. ............................................................................................................ Error! Bookmark not defined.
5. Разработка кода программы на языке LISP, что позволит переводить числа из одной
системы счисления в другую автоматически ...................................... Error! Bookmark not defined.
6. Разработка кода на языке Пролог проверки может ли указанный класс мотоцикла
развить заданную скорость (км/ч) и рассчитать за сколько времени минимально он проедет
заданное расстояние (в км) ...................................................................................................................... 4
7.
Загадка Эйнштейна: ‘Кто разводит рыбок?’ ............................................................................... 5
8. Написание программы на языке Common Lisp для шифрования текста методом
полиалфавитного буквенного текста с использованием ключевого слова — шифром
Виженера ...................................................................................................... Error! Bookmark not defined.
9.
Упорядочивание по возрастанию числового множества на языке Пролог ........................... 8
10.
Написание программы на языке Пролог, которая будет брать два аргумента,
являющихся положительными целыми числами и возвращать суммы всех чисел,
полученных при составлении ряда Фибоначчи, а затем выводить сумму полученных двух
ранее сумм ................................................................................................................................................10
11.
Существует дом с комнатами. Между некоторыми комнатами есть двери. В одной из
комнат находится клад. Требуется пройти через комнаты к кладу. Как вывести путь?.........11
12.
Написание программы быстрой сортировки на языке Пролог .........................................12
13.
Программа на языке Пролог для нахождения кратчайшего пути в лабиринте .............13
14.
Написание программы на языке Prolog вычисления суммы квадратов чисел
Фибоначчи до заданного числа ............................................................................................................15
15.
Найти пункты отправления и прибытия, если из города отправления можно долететь
до города прибытия с двумя пересадками ( Пролог) .......................................................................16
16.
Написание кода на языке Пролог вычисления геометрической прогрессии до
определенного числа с заданным множителем .................................................................................17
17.
Решение головоломки Эйнштейна с помощью кода на языке Пролог ............................18
18.
Составить программу на языке Пролог – перевоз фермера, козы, капусты и волка на
другой берег ..............................................................................................................................................20
19.
Написание программы на языке Пролог определения существования объекта в
Солнечной системе и некоторых параметров существующих объектов: Тип объекта, масса,
наличие спутников..................................................................................................................................22
20.
Написание программы на языке Лисп, реализующей алгоритм сортировки простыми
вставками .................................................................................................... Error! Bookmark not defined.
21.
Разработка кода на языке Пролог проверки наличия машины заданного класса на
стоянке и проверки наличия ее соседей .............................................................................................26
22.
Реализация жадного алгоритма на языке Пролог ................................................................27
1
1. Написание программы на языке Prolog заменяющей все четные элементы
списка из списка вещественных чисел на произвольную константу.
Автор Антипин Л.
skip([],[]).
skip([A|B],[A|C]):-replace(B,C,0).
replace([],[],_).
replace([_|B],[X|C],X):-skip(B,C).
:-skip([1,2,3,4,5],X),write(X).
Вопрос системе Пролог:
? - replace([1,2,3,4,5],_,_)
Ответ системы Пролог
[1,0,3,0,5]
Finish
2
2. Для двух строк символов создать новую строку путем посимвольной
конкатенации (язык Пролог)
Автор Горолатова
Для двух строк символов создать новую строку путем посимвольной конкатенации.
writeList:write('Введите первый массив в формате [a,b,c]:'),
read(L1),
write('Введите второй массив в формате [a,b,c]:'),
read(L2),
printList(L1,L2).
printList([H1 | T1],[H2 | T2]):write(H1),
write(H2),
printList(T1,T2).
printList([],[H2 | T2]):write(H2),
printList([],T2).
printList([H1 | T1],[]):write(H1),
printList(T1,[]).
Вопрос ?- writeList.
Ответ системы:
Введите первый массив в формате [a,b,c]:[d,k,4].
Введите второй массив в формате [a,b,c]:[h,2,m,t].
dhk24mt
3
3. Разработка кода на языке Пролог проверки может ли указанный класс
мотоцикла развить заданную скорость (км/ч) и рассчитать за сколько
времени минимально он проедет заданное расстояние (в км)
Автор Жирнов
moto(suzuki,250).
moto(yamaha,300).
moto(honda,280).
speed(X,Y):-moto(X,Z),Y<Z.
time(X,Y,Z):- moto(X,Q),Z is Y/Q.
Вопрос:
?-speed(honda,50).
Ответ:
true.
Ответы системы Пролог:
4
4. Загадка Эйнштейна: ‘Кто разводит рыбок?’ (язык Пролог)
Автор Зинина Н.
solve(W):W=[_,_,_,_,_],
%на улице стоят 5 домов
% дом(цвет, национальность, животное, напиток, сигареты)
first(house(_,no,_,_,_), W),
%Норвежец живёт в первом доме.
member(house(red,en,_,_,_), W),
%Англичанин живёт в красном доме.
left(house(green,_,_,_,_), house(white,_,_,_,_), W),
%Зелёный дом находится слева от белого, рядом с ним.
member(house(_,da,_,tea,_), W),
%Датчанин пьёт чай.
near(house(_,_,_,_,marlboro), house(_,_,cat,_,_), W),
%Тот, кто курит Marlboro, живёт рядом с тем, кто выращивает кошек.
member(house(yellow,_,_,_,dunhill), W),
%Тот, кто живёт в жёлтом доме, курит Dunhill.
member(house(_,de,_,_,rothmans), W),
%Немец курит Rothmans.
middle(house(_,_,_,milk,_), W),
%Тот, кто живёт в центре, пьёт молоко.
near(house(_,_,_,_,marlboro), house(_,_,_,water,_), W),
%Сосед того, кто курит Marlboro, пьёт воду.
member(house(_,_,bird,_,pallmall), W),
%Тот, кто курит Pall Mall, выращивает птиц.
member(house(_,sw,dog,_,_), W),
%Швед выращивает собак.
5
near(house(_,no,_,_,_), house(blue,_,_,_,_), W),
%Норвежец живёт рядом с синим домом.
near(house(_,_,horse,_,_), house(_,_,_,_,dunhill), W),
%Тот, кто выращивает лошадей, живёт рядом с тем, кто курит Dunhill
member(house(_,_,_,beer,winfield), W),
%Тот, кто курит Winfield, пьет пиво.
member(house(green,_,_,coffee,_), W),
%В зелёном доме пьют кофе.
member(house(_,_,fish,_,_), W).
% В доме живет рыба
first(H, [H,_,_,_,_]).
middle(H, [_,_,H,_,_]).
left(H1, H2, W):W=[H1,H2,_,_,_];
W=[_,H1,H2,_,_];
W=[_,_,H1,H2,_];
W=[_,_,_,H1,H2].
near(H1,H2,W):left(H1,H2,W);
left(H2,H1,W).
6
Вопрос: «Кто разводит рыбок?»
Расшифровка ответа:
1.
2.
3.
4.
5.
В желтом доме живет норвежец, у него есть кошка, он пьет воду и курит dunhill.
В синем доме живет датчанин, у него есть лошадь, он пьет чай и курит dunhill.
В красном доме живет англичанин, у него есть птичка, он пьет молоко и курит pallmall.
В зеленом доме живет немец, у него есть рыбки, он пьет кофе и курит rothmans.
В белом доме живет швед, у него есть собака, он пьет пиво и курит winfield.
Рыбок разводит немец.
7
5. Упорядочивание по возрастанию числового множества на языке Пролог
Автор Кочемаева
sort:-
write('Введите массив чисел = '), read(X), nl,
write('Выберите метод сортировки'),nl,write('
1 - Быстрая сортировка,
2 - Метод вставки,
3 - Метод пузырька,
4 - Метод наивной сортировки'),
nl,
read(Y), nl,
methodSort(Y,X).
methodSort(1,X):-
qsort(X,Z),
write(Z),!.
methodSort(2,X):-
insort(X,Z),
write(Z),!.
methodSort(3,X):-
busort(X,Z),
write(Z),!.
methodSort(4,X):-
sortn(X,Z),
write(Z),!.
methodSort(_,_):-
write('Нет такого варианта'),!.
order(X, Y) :- X =< Y.
qsort([], []).
qsort([H|Tail], S) :- split(H, Tail, Small, Big), qsort(Small, Small1),
qsort(Big, Big1), append(Small1, [H|Big1], S).
split(H, [A|Tail], [A|Small], Big) :- order(A, H), !, split(H, Tail, Small, Big).
split(H, [A|Tail], Small, [A|Big]) :- split(H, Tail, Small, Big).
split(_, [], [], []).
insort([], []).
insort([X|L], M) :- insort(L, N), insortx(X, N, M).
insortx(X, [A|L], [A|M]) :- order(A, X), !, insortx(X, L, M).
insortx(X, L, [X|L]).
busort(L, S) :- swap(L, M), !, busort(M, S).
busort(L, L) :- !.
swap([X, Y|R], [Y, X|R]) :- order(Y, X).
swap([X|R], [X|R1]) :- swap(R, R1).
sortn(L1, L2) :- permutation(L1, L2), sorted(L2), !.
permutation(L, [H|T]) :- append(V, [H|U], L), append(V, U, W),
permutation(W, T).
8
permutation([], []).
sorted([L]).
sorted([X,Y|T]) :- order(X,Y), sorted([Y|T]).
9
6. Написание программы на языке Пролог, которая будет брать два аргумента,
являющихся положительными целыми числами и возвращать суммы всех
чисел, полученных при составлении ряда Фибоначчи, а затем выводить сумму
полученных двух ранее сумм
Автор Кузнецов А.
fac(1,1):-!.
fac(N,R):-M is N-1, fac(M,Mfac),R is N+Mfac.
factorial(N,R):-fac(N,R).
factor(N,B,S):-factorial(N,R),factorial(B,L), S is R+L.
Вопрос
?-factor(6,7,S).
Ответ системы пролог
S=49.
10
7. Существует дом с комнатами. Между некоторыми комнатами есть двери. В
одной из комнат находится клад. Требуется пройти через комнаты к кладу.
Как вывести путь? (язык Пролог)
Автор Куликова А.
door(a,b).
door(b,c).
door(b,e).
door(d,e).
door(d,c).
door(e,g).
door(e,f).
money(g).
path(Y,Y,T):-money(Y),write(T).
path(X,Y,T):-door(X,Z),not(member(Z,T)), path(Z,Y,[Z|T]).
Ответ системы Пролог:
[g,a,b]
X=g
То есть, клад находится в комнате g. Путь к комнате найден.
Ответ системы Пролог:
11
8. Написание программы быстрой сортировки на языке Пролог
Автор Мишин А.
qsort([], []).
qsort([H|Tail], S) :- split(H, Tail, Small, Big),
qsort(Small, Small1),
qsort(Big, Big1),
append(Small1, [H|Big1], S).
order(X, Y) :- X =< Y.
split(H, [A|Tail], [A|Small], Big) :- order(A, H), !,
split(H, Tail, Small, Big).
split(H, [A|Tail], Small, [A|Big]) :- split(H, Tail, Small, Big).
split(_, [], [], []).
2 ?- qsort([3,5,2,1,4,6,8,7],S).
S = [1,2,3,4,5,6,7]
12
9. Программа на языке Пролог для нахождения кратчайшего пути в лабиринте
Автор Нагорнова Т.
door(a,b).
door(b,c).
door(b, e).
door(d, e).
door(d, c).
door(e,g).
door(e,f).
money(g).
move(A, B):- door(A, B);door(B, A).
search_bdth(Start, Finish):- bdth([[Start]], Finish, Way),money(Finish), show_answer(Way).
member(H,[H|_]).
member(H,[_|Tail]):-member(H,Tail).
append([],L,L).
append([X|L1],L2,[X|L3]):-append(L1,L2,L3).
prolong([Temp|Tail],[New,Temp|Tail]):move(Temp,New),not(member(New,[Temp|Tail])).
bdth([[Finish|Tail]|_],Finish,[Finish|Tail]).
bdth([TempWay|OtherWays],Finish,Way):findall(W,prolong(TempWay,W),Ways),
append(OtherWays,Ways,NewWays),
bdth(NewWays,Finish,Way).
show_answer([_]):-!.
show_answer([A,B|Tail]):show_answer([B|Tail]),nl,write(B),write(' -> '),write(A).
Вопрос
?- search_bdth(a,X), money(X).
Ответ системы пролог:
a -> b
b -> e
e -> g
X=g
13
14
10. Написание программы на языке Prolog вычисления суммы квадратов чисел
Фибоначчи до заданного числа
Автор Насыров М. (ошибки!)
fib(0,5,1,1,1):-!.
fib(D,K,M,N,Z):-D>0,D1 is D-1,fib(D1,K1,M1,N1,Z1),K is K1,K1>Z1,N is
M1,write('n='),write(N),nl,M is M1+N1,Z1>0,Z is
M1*M1)+(N1*N1),write('z='),write(Z),nl;write('finish').
Вопрос
?- fib(5,K,M,N,Z).
Ответ системы Пролог:
N=1
Z=2
N=2
Z=5
Finish
15
11. Найти пункты отправления и прибытия, если из города отправления можно
долететь до города прибытия с двумя пересадками ( Пролог)
Автор Нуриманова
reys(samara,pensa).
reys(pensa,moskva).
not(A):-A,!,fail.
not(_).
avia1(A,B):-reys(A,C),reys(C,B),not(reys(A,B)).
avia2(A,B):-reys(A,C),reys(C,E),reys(E,B),not(avia1(A,B)).
А если с одной пересадкой :
Ответ: пункт отправления - Оренбург, пункт прибытия –Пенза.
(пересадка в Самаре)
16
12. Написание кода на языке Пролог вычисления геометрической прогрессии до
определенного числа с заданным множителем
Автор Овчинникова М.
ttt:-write('B='),read(B),write('N='),read(N),write('P='),read(P),
N>1,P>0,B>0,P>B,integer(B),integer(P),integer(N),line(B,N,P),!.
line(B,N,P):-P>B,B1 is B*N, write(B), nl, line(B1,N,P),!.
Вопрос:
?-ttt.
Ответ:
B=2.
N=2.
P=15.
2 ; (2*1)
4 ; (2*2*1)
8 ; (2*2*2*1)
17
13. Решение головоломки Эйнштейна с помощью кода на языке Пролог
Автор Ожиганов А.
houses([
house(первый, _, _, _, _, _),
house(второй, _, _, _, _, _),
house(третий, _, _, _, _, _),
house(четвёртый, _, _, _, _, _),
house(пятый, _, _, _, _, _)
]).
right_of(A, B, [B, A | _]).
right_of(A, B, [_ | Y]) :- right_of(A, B, Y).
next_to(A, B, [A, B | _]).
next_to(A, B, [B, A | _]).
next_to(A, B, [_ | Y]) :- next_to(A, B, Y).
mymember(X, [X|_]).
mymember(X, [_|Y]) :- mymember(X, Y).
print_houses([]).
print_houses([A|B]) :write(A), nl,
print_houses(B).
who_owns_the_zebra(H):-houses(H),
mymember(house(_,красный,англичанин,_,_,_),H),
mymember(house(_,_,испанец,собака,_,_),H),
mymember(house(_,зелёный,_,_,кофе,_),H),
mymember(house(_,_,украинец,_,чай,_),H),
right_of(house(_,зелёный,_,_,_,_),
house(_,белый,_,_,_,_),H),
mymember(house(_,_,_,улитки,_,oldgold),H),
mymember(house(_,жёлтый,_,_,_,kools),H),
H=[_,_,house(_,_,_,_,молоко,_),_,_],
mymember(house(первый,_,норвежец,_,_,_),H),
next_to(house(_,_,_,_,_,chesterfield),
18
house(_,_,_,лиса,_,_),H),
next_to(house(_,_,_,лошадь,_,_),
house(_,_,_,_,_,kools),H),
mymember(house(_,_,_,_,сок,luckystrike),H),
mymember(house(_,_,японец,_,_,parliamen),H),
next_to(house(_,_,норвежец,_,_,_),
house(_,синий,_,_,_,_),H),
mymember(house(_,_,японец,_,_,parliamen),H),
mymember(house(_,_,_,_,вода,_),H),
mymember(house(_,_,_,зебра,_,_),H),
print_houses(H).
Вопрос:
?- who_owns_the_zebra(_).
Ответ системы Пролог:
house(первый, жёлтый, норвежец, лиса, вода, kools)
house(второй, синий, украинец, лошадь, чай, chesterfield)
house(третий, красный, англичанин, улитки, молоко, oldgold)
house(четвёртый, белый, испанец, собака, сок, luckystrike)
house(пятый, зелёный, японец, зебра, кофе, parliamen)
true
?- who_owns_the_zebra(_).
house(первый,жёлтый,норвежец,лиса,вода,kools)
house(второй,синий,украинец,лошадь,чай,chesterfield)
house(третий,красный,англичанин,улитки,молоко,oldgold)
house(четвёртый,белый,испанец,собака,сок,luckystrike)
house(пятый,зелёный,японец,зебра,кофе,parliamen)
true
19
14. Составить программу на языке Пролог – перевоз фермера, козы, капусты и
волка на другой берег
Автор Паросова О.
% противоположные берега %
opposite(east,west).
opposite(west,east).
% переплывают фермер и волк %
move(state(X,X,G,C),state(Y,Y,G,C)):-opposite(X,Y).
% переплывают фермер и капуста%
move(state(X,W,G,X),state(Y,W,G,Y)):-opposite(X,Y).
% переплывают фермер и коза %
move(state(X,W,X,C),state(Y,W,Y,C)):-opposite(X,Y).
% переплывает только фермер %
move(state(X,W,G,C),state(Y,W,G,C)):-opposite(X,Y).
% состояние, при котором волк съедает козу %
unsafe( state(F,X,X,_) ):- opposite(F,X).
% состояние, при котором коза съедает капусту %
unsafe( state(F,_,X,X) ):- opposite(F,X).
% определяется путь%
path(S,G,L,L1): - move(S,S1),not( unsafe(S1) ), not( member(S1,L) ), path( S1,G,[S1|L],L1),!.
path(G,G,T,T):-!.
% конечное состояние достигнуто %
% цель: перевезти всех с восточного берега на западный %
go:-go(state(east,east,east,east),state(west,west,west,west)).
go(S,G):- path(S,G,[S],L),nl,write('A solution is:'),nl,write_path(L), fail.
go(_,_).
20
member(X,[X|_]).
member(X,[_|L]):-member(X,L).
% вывод %
write_move( state(X,W,G,C), state(Y,W,G,C) ) :-!,
write('The farmer crosses the river from '),
write(X), write(' to '), write(Y),nl.
write_move( state(X,X,G,C), state(Y,Y,G,C) ) :-!,
write('The farmer takes the Wolf from '),
write(X), write(' of the river to '), write(Y),nl.
write_move( state(X,W,G,X), state(Y,W,G,Y) ) :-!,
write('The farmer takes the cabbage from '),
write(X), write(' of the river to '),
write(Y),nl.
write_move( state(X,W,X,C), state(Y,W,Y,C) ) :-!,
write('The farmer takes the Goat from' ),
write(X),
write(' of the river to '),
write_path( [H1,H2|T] ) :- !,
write(Y),nl.
write_move(H1,H2),write_path([H2|T]).
write_path( _ ).
21
15. Написание программы на языке Пролог определения существования объекта
в Солнечной системе и некоторых параметров существующих объектов: Тип
объекта, масса, наличие спутников.
Автор Плугин Т.
weight(148.2*10^21, ганмед).
weight(107.6*10^21, калисто).
weight(89.3*10^21, ио).
weight(48*10^21, европа).
weight(89.3*10^21, ио).
weight(0.065*10^21, миранда).
weight(1.2*10^21, умбриэль).
weight(1.35*10^21, ариель).
weight(3.014*10^21, оберон).
weight(3.52*10^21, титания).
weight(0.1*10^21, энцелад).
weight(0.6*10^21, тефия).
weight(1*10^21, диона).
weight(1.9*10^21, япет).
weight(134.5*10^21, титан).
weight(2.3*10^21, рея).
weight(1.52*10^21, харон).
weight(0.05*10^21, протей).
weight(21.5*10^21, трион).
weight(73.5*10^21, луна).
weight(1898600*10^21, юпитер).
weight(102430*10^21, нептун).
weight(330.2*10^21, меркурий).
weight(4868.5*10^21, венера).
weight(568460*10^21, сатурн).
22
weight(5973.6*10^21, земля).
weight(641.85*10^21, марс).
weight(86832*10^21, уран).
weight(1989100000*10^21, солнце).
satellites(X):-
X='юпитер',write('Спутники: '), write('Ганмед, Калисто, Ио');
X='уран',write('Спутники: '),write('Оберон, Умбриаль, Ариэль Титания');
X='сатурн',write('Спутники: '),write('Титан, Рея, Япет Диона, Тефия, Энцелад');
X='нептун',write('Спутники: '),write('Тритон, Протей');
X='земля',write('Спутники: '),write('Луна');
write('Спутников нет :(').
objectType(X):- X='солнце',write('Солнце'),nl,!;
X='юпитер',write('Планета'),nl;
X='сатурн',write('Планета'),nl;
X='уран',write('Планета'),nl;
X='нептун',write('Планета'),nl;
X='земля',write('Планета'),nl;
X='венера',write('Планета'),nl;
X='марс',write('Планета'),nl;
X='меркурий',write('Планета'),nl,!;
X='ганмед',write('Спутник'),nl;
X='калисто',write('Спутник'),nl;
X='ио', write('Спутник'),nl;
X='титания',write('Спутник'),nl;
X='оберон',
write('Спутник'),nl;
X='умбриаль',
write('Спутник'),nl;
X='ариэль',
write('Спутник'),nl;
X='титания',
write('Спутник'),nl;
X='титан',
write('Спутник'),nl;
X='рея', write('Спутник'),nl;
23
X='япет',
write('Спутник'),nl;
X='диона',
write('Спутник'),nl;
X='тефия',
write('Спутник'),nl;
X='энцелад',
write('Спутник'),nl;
X='тритон',
write('Спутник'),nl;
X='протей',
write('Спутник'),nl;
X='луна',
write('Спутник'),nl,!;
write('Такого объекта в солнечной системе нет :)'),!.
info:-write('Введите название объекта '),
read(X), objectType(X), weight(WEIGHT,X),
write('Масса этого объекта составляет ': WEIGHT),write(' кг.'),
nl, satellites(X).
?- info.
Ответ системы Пролог:
Введите название объекта
Земля
Планета
Масса этого объекта составляет: 5973,6*10^21 кг.
Спутники: Луна
Тестирование:
1 ?- info.
Введите название объекта земля.
Планета
Масса этого объекта составляет :5973.6*10^21 кг.
Спутники: Луна
true .
2 ?- info.
Введите название объекта сатурн.
Планета
24
Масса этого объекта составляет :568460*10^21 кг.
Спутники: Титан, Рея, Япет Диона, Тефия, Энцелад
true .
3 ?- info.
Введите название объекта титан.
Спутник
Масса этого объекта составляет :134.5*10^21 кг.
Спутников нет :(
true
4 ?- info.
Введите название объекта табуретка.
Такого объекта в солнечной системе нет :)
false.
25
16. Разработка кода на языке Пролог проверки наличия машины заданного
класса на стоянке и проверки наличия ее соседей
Автор Щербаков Д.
stoynka(bmw).
% база данных - какие машины имеются на стоянке
stoynka(volvo).
stoynka(kia).
stoynka(cadillac).
sosed(bmw,volvo).
% база данных, какие машины стоят рядом друг с другом
sosed(bmw,cadillac).
sosed(cadillaс,kia).
car(X):-stoynka(X).
% правило проверки, есть ли введенная машина на стоянке
place(X,Y):-sosed(X,Y);sosed(Y,X).
% правило проверки, стоят ли введенные машины рядом
Вопрос:
?-car(bmw).
Ответ:
true.
26
17. Реализация жадного алгоритма на языке Пролог
Автор Якищик Д.
minimum([],Z,Z):-!.
minimum([[X1,X2,R]|Y],Z1,Z2):not(search(X1,X2,Z1,[X1])), !,minimum(Y,[[X1,X2,R]|Z1],Z2).
minimum([_|Y],Z1,Z2):-minimum(Y,Z1,Z2).
search(X1,X2,Y,_):- member([X1,X2,_],Y).
search(X1,X2,Y,_):- member([X2,X1,_],Y).
search(X1,X2,Y,Z):- member([X1,X3,_],Y),not(member(X3,Z)),
search(X3,X2,Y,[X3|Z]).
search(X1,X2,Y,Z):- member([X3,X1,_],Y),
not(member(X3,Z)),
search(X3,X2,Y,[X3|Z]).
ins(X,[],[X]).
ins([X1,X2,R1],[[Y1,Y2,R2]|L],[[X1,X2,R1]|[[Y1,Y2,R2]|L]]):- R1<R2,!.
ins(X,[Y|L1],[Y|L2]):-ins(X,L1,L2).
sort([],Y,Y).
sort([X|L],Y1,Y3):- ins(X,Y1,Y2), sort(L,Y2,Y3).
graph([X|L],Y,Z):-
sort(Y,[],Y1), minimum(Y1,[],Z),
all(X,L,Z).
all(_,[],_).
all(X,[Y|L],Z):-search(X,Y,Z,[X]), !,all(X,L,Z).
sum([], 0).
sum([[_,_,R]|T],S1):-
sum(T,S2), S1 is S2 + R.
function:write_ln('Узлы(например [a,b,c] значит граф включает в себя три узла - a, b и c):'), read(X),
write_ln('Расстояния между узлами(Вес ребра)(например [[a,b,3],[a,c,4]]значит у ребра ab
и ac вес 3 и 4 соответственно):'), read(Y),
graph(X,Y,Z),
sum(Y, Summa),
write('Вес исходного графа: '),
write_ln(Summa),
write('Оптимальная конфигурация: '),
write_ln(Z),
27
sum(Z,Summa1),
write('Вес минимального остовного дерева: '),
write_ln(Summa1).
28
Download