Задачи Visual Prolog
Задание 1
predicates Vozvedenie(unsigned,real) Vozvedenie(unsigned,real,unsigned,real) clauses Vozvedenie(Kol,St):- Vozvedenie(Kol,St,0,1). Vozvedenie(Kol,St,Kol,St):-!. Vozvedenie(Kol,St,I,P):- Isxodnoe = I+1, Poluchennoe= P*2, write(Isxodnoe,"\t", Poluchennoe, '\r'), Vozvedenie(Kol, St, Isxodnoe, Poluchennoe). goal Vozvedenie(10,X).
Задание 2
domains
name = string
league = integer
predicates
go
match(name,league)
challenges(name,league)
play(name,name)
igrok(name,league)
clauses
go:-
igrok(A,B), match(A,B).
match(A,B):-
challenges(A,B),
B1=B-1,
challenges(A,B1).
challenges(A1,B2):-
igrok(A2,B2),
play(A1,A2),!.
play(A,A):-!.
play(A1,A2):-
write(A1," versus ",A2),nl,fail.
igrok("Tany",2).
igrok("Roma",1).
igrok("Sveta",3).
igrok("Pavel",2).
igrok("Ivan",1).
igrok("Dima",3).
goal
go.
Задание 3.1
Напишите подходящие определения доменов с помощью основных объектов Visual Prolog, которые могут быть использованы в каталоге музыкальных пьес. Типичное содержимое каталога: Show: West Side Story (Пьеса: Вестсайдская история) Lirics: Stephen Sondheim (Текст: Стефан Сондхейм) Music: Leonard Bernstein (Музыка: Леонард Бернстайн)
domains show = string lyrics = string music = string predicates catalog(show, lyrics, music) - nondeterm (o,o,o) clauses catalog("West Side Story","Stephen Sondheim","Leonard Bernstein"). goal catalog(Show, Lyrics, Music).
Задание 3.2
Измените программу ch06e01.pro так, чтобы предикат country имел 2 характеристики - name (название) и population (население) - и на печать выводились только названия стран, имеющих население более 10 миллионов (1e+7).
predicates
country(symbol,integer) - nondeterm (o,o)
print_countries - procedure ()
clauses
country("England", 15000000).
country("France", 7000000).
country("Germany", 3000000).
country("Denmark", 57000000).
print_countries:-
country(X,Y),
Y>1e+7,
write(X), /* write the value of X */
nl, /* start a new line */
fail.
print_countries.
goal
print_countries.
Задание 4.1
Запишите предикат с названием sum_of, который работает так же, как length_of, за исключением того, что он работает со списком чисел и суммирует их. Например, целевое утверждение sum_of([1, 2, 3, 4], S) должно присваивать S значение 10.
domains list = integer* predicates sum_of(list, integer,integer) - procedure(i,o,o) run - procedure() clauses sum_of([], 0, 0). sum_of([H|T], S, N):- sum_of(T, Sum, N1), S = Sum+H, N=N1+1. run:- sum_of([1, 2, 3, 4], S, N), Ave=S/N, write("Summa=", S),nl, write("Kol-vo=", N),nl, write("average=", Ave),nl. goal run.
Задание 4.2
Добавьте утверждения в разделы domain и predicate программы ch07e06.pro таким образом, чтобы вы могли использовать member для установки принадлежности числа числовому списку.
domains namelist = name* name = integer predicates member(name,namelist) - nondeterm (i,i) clauses member(Name,[Name|_]). member(Name,[_|Tail]):- member(Name,Tail). goal member(4,[1,2,3]).
Задание 4.3
Запишите предикат real_average, который вычисляет среднее значение всех элементов списка действительных чисел.
domains list = integer* predicates sum_of(list, integer, integer) - procedure (i,o,o) run - procedure () clauses sum_of([], 0, 0). sum_of([H|T],Sum,N):- sum_of(T,S1,N1), Sum = H + S1, N = N1 + 1. run:- sum_of([1,2,3,4],Sum,N), Ave = Sum/N, write("Summa=", Sum),nl, write("Kolichestvo=", N),nl, write("Average=", Ave),nl. goal run.
Задание 7.1
predicates factorial(unsigned,real,real,real) factorial(unsigned,real,integer,real,real,real) clauses factorial(N,FactN,FactN,FactN):- factorial(N,FactN,-15,1,1,1). factorial(N,FactN,N,FactN,FactN,FactN):-!. factorial(N,FactN,I,P1,P2,P3):- NewI = I+15, NewI<361, NewP1 = cos(NewI*3.14159265/180), NewP2 = sin(NewI*3.14159265/180), NewP3 = tan(NewI*3.14159265/180), write(NewI,"\t", NewP1,"\t", NewP2,"\t", NewP3),nl, factorial(N, FactN, NewI, NewP1,NewP2,NewP3). goal factorial(24,X,Y,Z).
Задание 7.2
predicates solve(real,real,real) - procedure (i,i,i) reply(real,real,real) - procedure (i,i,i) mysqrt(real,real,real) - procedure (i,i,o) equal(real,real) - determ (i,i) clauses solve(A,B,C):- D=B*B-4*A*C, reply(A, B, D), nl. reply(_,_,D):- D < 0, write("Нет решения"),!. reply(A,B,D):- D=0, X=-B/(2*A),write("x=", X),!. reply(A,B,D):- mysqrt(D,D,SqrtD), X1=(-B+SqrtD)/(2*A), X2 = (-B - SqrtD)/(2*A), write("x1 = ", X1," and x2 = ", X2). mysqrt(X,Guess,Root):- NewGuess = Guess-(Guess*Guess-X)/2/Guess, not(equal(NewGuess,Guess)), !, mysqrt(X,NewGuess,Root). mysqrt(_,Guess,Guess). equal(X,Y):- X/Y >0.99999, X/Y < 1.00001. goal write("A="), readreal(A), write("B="), readreal(B), write("C="), readreal(C), write(A, "x^2+", B, "x", "+", C, "\n\r"), solve(A,B,C).