Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Компютерні системи штучного інтелекту_методичні...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
521.73 Кб
Скачать

2.1. Програма роботи та завдання.

2.1.1. Створити в середовищі Turbo Prolog програму подібну прикладу 1 та дослідити її.

2.1.2. Задати різні варіанти цілей та проаналізувати отримані результати.

2.1.3. Дослідити програму з прикладу 2. Зафіксувати результати.

2.1.4. Дослідити програму прикладу 3 з подальшою модифікацією за вибором студента.

2.1.5. Зафіксувати у звіті вихідні коди створених програм та логіку їх роботи.

2.1.6. Відповісти письмово на контрольні питання.

Контрольні питання:

1) Що таке база даних?

2) Предикати для роботи із БД?

3) Способи представлення баз даних в системі Turbo Prolog?

Лабораторне заняття № 14

Тема: Стандартна задача про розміщення королев на шахівниці

Мета роботи. Дослідити роботу програми для розв’язання задачі про розміщення королев для різного числа рядків і стовпців; проаналізувати отримані результати.

1. Теоретичні відомості

Задача про N королев формулюється наступним чином. Необхідно розставити на шахівниці N королев таким чином , щоб ніякі дві королеви не змогли побити одна одну згідно правил гри в шахи. Тому, ніякі дві королеви не можуть бути розміщені в одному ряду: по вертикалі , горизонталі , діагоналі.

Для розв’язання задачі, пронумеруємо вертикальні та горизонтальні рядки шахової дошки від 1 до N. Для нумерації діагоналі, розділимо їх на два типи таким чином, щоб діагональ специфицифікувалась типом і номером, які обчислюються із її вертикальних і горизонтальних рядів:

Diagonal = N + Column - Row (type 1)

Diagonal = Row + Column - 1 (type 2)

Якщо ви дивитесь на шахівницю, на ряд 1 по горизонталі та колонку 1 по вертикалі з лівої сторони , тоді Tun1 розділяє діагоналлю клітку як символ похилої риски вліво (\), а Tun2 - вправо (/). Малюнок демонструє нумерацію діагоналей Tunу2 на дошці 4х4.

| 1 | 2 | 3 | 4 |

1 | 1 | 2 | 3 | 4 |

2 | 2 | 3 | 4 | 5 |

3 | 3 | 4 | 5 | 6 |

4 | 4 | 5 | 6 | 7 |

Нумерація діагоналей Типу2 на шахівниці.

2. Практична частина

domains

queen = q(integer, integer)

queens = queen*

freelist = integer*

board = board(queens, freelist, freelist, freelist, freelist)

predicates

placeN(integer, board, board)

place_a_queen(integer, board, board)

nqueens(integer)

makelist(integer, freelist)

findandremove(integer, freelist, freelist)

nextrow(integer, freelist, freelist)

clauses

nqueens(N) :-

makelist(N, L),

Diagonal = N*2-1,

makelist(Diagonal, LL),

placeN(N, board([], L, L, LL, LL), Final),

write(Final).

placeN(_,

board(D, [], [], D1, D2),

board(D, [], [], D1, D2)):- !.

placeN(N, Board1, Result) :-

place_a_queen(N, Board1, Board2),

placeN(N, Board2, Result).

place_a_queen(N, board(Queens, Rows, Columns, Diag1, Diag2),

board([q(R,C)|Queens], NewR, NewC, NewD1, NewD2)):-

nextrow(R, Rows, NewR), findandremove(C, Columns, NewC),

D1 = N+C-R, findandremove(D1, Diag1, NewD1), D2 = R+C-1,

findandremove(D2, Diag2, NewD2).

findandremove(X, [X|Rest], Rest).

findandremove(X, [Y|Rest], [Y|Tail]):- findandremove(X, Rest, Tail).

makelist(1, [1]).

makelist(N, [N|Rest]) :- N1 = N-1, makelist(N1, Rest).

nextrow(Row, [Row|Rest], Rest).