Задача 1
Напишем программу для расчёта суммы чисел.
Copy listing.
:- dynamic a/1.
:- dynamic b/1.
true.
saveA(X) :- assert(a(X)); true.
saveB(X) :- assert(b(X)); true.
initVariables(A, B) :- saveA(A), saveB(B).
countSumma(S) :- a(I), b(J), C = I + J, S is C.
writeSumma(K) :- W is K, write(W), nl.
f(N, M) :- initVariables(N, M), countSumma(Z), writeSumma(Z).
Запускаем программу.
Задача 2
Напишем программу для изменения значения одной переменной в базе данных.
Copy listing.
:- dynamic a/1.
true.
saveA(X) :- assert(a(X)); true.
deleteA :- retract(a(Y)); true.
writeA :- a(Z), W is Z, write(W), nl.
myblok(M) :- deleteA, saveA(M), writeA.
g :- myblok(10), myblok(20), myblok(30), myblok(40).
Запускаем программу.
Задача 3
Пользователь вводит с клавиатуры целые числа.
Ввод заканчивается при введении числа ноль.
Далее выводится на экран сумма чисел.
Copy listing.
:- dynamic a/1.
true.
saveA(X) :- assert(a(X)); true.
deleteA :- retract(a(Y)); true.
writeA :- a(Z), W is Z, write(W), nl.
f :- N = 0,
write("Input number: "), nl,
read(K), nl,
a(H),
Q = H + K,
P is Q,
deleteA,
saveA(P),
K =:= N, writeA, !, fail; f.
start :- deleteA, saveA(0), !, f.
Запускаем программу.
Задача 4
Пользователь вводит число пар.
Далее пользователем вводятся пары вида ключ - значение.
После этого все пары выводятся на экран.
Copy listing.
:- dynamic a/2.
:- dynamic n/1.
true.
savePair(K, V) :- assert(a(K, V)); true.
deletePair(K, V) :- retract(a(K, V)); true.
setPair(K, V) :- deletePair(K, V), savePair(K, V); true.
readNumberOfPairs :- write("Input pairs number: "), nl,
read(N), nl,
assert(n(N));
true.
cycle(I) :- n(N), I < N,
write("Input KEY: "), nl,
read(K), nl,
write("Input VALUE: "), nl,
read(V), nl,
setPair(K, V),
J is (I + 1),
!, cycle(J); true.
printOnePair(K, V) :- write(K), write(" "), write(V), nl.
printPairs :- a(K, V), printOnePair(K, V), fail.
printPairsWithTrue :- printPairs; true.
play :- readNumberOfPairs, !, cycle(0), nl, nl,
write("All pairs: "), nl, nl, !, printPairsWithTrue, nl, nl.
Запускаем программу.
Copy play.
3.
maxim.
100.
nina.
200.
george.
300.
Задача 5
Вводится число N.
Вводятся N элементов массива.
На экран выводится изначальный массив и отсортированный массив.
Copy listing.
:- dynamic a/2.
:- dynamic n/1.
true.
readN :- retract(n(ALL));
write("Input N: "), nl,
read(N), nl,
assert(n(N)).
savePair(K, V) :- assert(a(K, V)); true.
deletePair(K) :- retract(a(K, ALL)); true.
setPair(K, V) :- deletePair(K), savePair(K, V), true.
readVariables(I) :- n(N),
I < N,
write("Input element of array: "), nl,
read(X),
J is I,
setPair(J, X),
K = I + 1,
R is K,
!, readVariables(R).
readVariablesTrue(I) :- readVariables(I); true.
printVariables(I) :- n(N), I < N, J is I, a(J, X),
write(J), write(") "), write(X), nl, K = I + 1, R is K, !, printVariables(R).
printVariablesTrue(I) :- printVariables(I); true.
sortCycleFirst(I) :- n(N), I < N, sortCycleSecondTrue(I, 0), K is (I + 1), !, sortCycleFirst(K).
sortCycleFirstTrue(I) :- sortCycleFirst(I); true.
sortCycleSecond(I, J) :- n(N), J < N, compareAndChangeTrue(I, J), K is (J + 1), !, sortCycleSecond(I, K).
sortCycleSecondTrue(I, J) :- sortCycleSecond(I, J); true.
compareAndChange(I, J) :- a(I, X), a(J, Y), II is I, JJ is J, X < Y, !, swapElements(II, JJ).
compareAndChangeTrue(I, J) :- compareAndChange(I, J); true.
swapElements(I, J) :- a(I, X), a(J, Y), setPair(I, Y), setPair(J, X), true.
play :- readN, readVariablesTrue(0), nl, nl,
write("Old array: "), nl, printVariablesTrue(0), nl,
sortCycleFirstTrue(0), nl,
write("Sorted array: "), nl, printVariablesTrue(0), nl.
Запускаем программу.
Copy play.
4.
20.
40.
10.
30.
Задача 6
Считать содержимое файла.
Убрать лишние пробелы.
Результат вывести на экран и в другой файл.
Copy listing.
:- dynamic a/1.
:- dynamic b/1.
true.
saveA(X) :- assert(a(X)); true.
deleteA :- retract(a(X)); true.
setValueA(X) :- deleteA, saveA(X), true.
saveB(X) :- assert(b(X)); true.
deleteB :- retract(b(X)); true.
setValueB(X) :- deleteB, saveB(X), true.
readWord(InStream):- get_code(InStream, N),
N > -1,
char_code(C, N),
setValueB(N),
true.
addToFile(N, PrintStream) :- char_code(C, N), write(C), write(PrintStream, C), true.
addToFileTrue(N, PrintStream) :- addToFile(N, PrintStream); true.
control_1(PrintStream) :- b(N), N \== 32, addToFileTrue(N, PrintStream), setValueA(1); control_2(PrintStream).
control_2(PrintStream) :- b(N), N =:= 32, a(A), A =:= 1, addToFileTrue(N, PrintStream), setValueA(0); control_3(PrintStream).
control_3(PrintStream) :- b(N), N =:= 32, a(A), A =:= 0; control_4(PrintStream).
control_4(PrintStream) :- true.
cycle(Stream, PrintStream) :- !, readWord(Stream), !, control_1(PrintStream), !, cycle(Stream, PrintStream).
cycleTrue(Stream, PrintStream) :- cycle(Stream, PrintStream); true.
main :- nl, nl,
open("myanswerfile.txt", write, PrintStream),
setValueA(0),
open("myfile.txt", read, MyStream),
cycleTrue(MyStream, PrintStream),
close(MyStream),
nl, nl,
close(PrintStream).
true.
Запускаем программу.