# База данных

## Задача 1

Напишем программу для расчёта суммы чисел.

```
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).
```

Запускаем программу.

```
f(2, 5).
```

## Задача 2

Напишем программу для изменения значения одной переменной в базе данных.

```
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).
```

Запускаем программу.

```
g.
```

## Задача 3

Пользователь вводит с клавиатуры целые числа.

Ввод заканчивается при введении числа ноль.

Далее выводится на экран сумма чисел.

```
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.
```

Запускаем программу.

```
start.
12.
9.
17.
0.
```

## Задача 4

Пользователь вводит число пар.

Далее пользователем вводятся пары вида ключ - значение.

После этого все пары выводятся на экран.

```
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.
```

Запускаем программу.

```
play.
3.
maxim.
100.
nina.
200.
george.
300.
```

## Задача 5

Вводится число N.

Вводятся N элементов массива.

На экран выводится изначальный массив и отсортированный массив.

```
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.
```

Запускаем программу.

```
play.
4.
20.
40.
10.
30.
```

## Задача 6

Считать содержимое файла.

Убрать лишние пробелы.

Результат вывести на экран и в другой файл.

```
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.
```

Запускаем программу.

```
main.
```
