Разработка программы с использованием языка логического программирования Prolog

  • Вид работы:
    Реферат
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    4,76 Кб
  • Опубликовано:
    2012-10-12
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка программы с использованием языка логического программирования Prolog

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Кафедра

вычислительной техники



ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

К КУРСОВОМУ ПРОЕКТУ ПО ДИСЦИПЛИНЕ

"ФУНКЦИОНАЛЬНОЕ И ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ"

Тема:

Разработка программы с использованием языка логического программирования Prolog

Студент:

Гайфулин И. Р.

Преподаватель:

Новицкая Ю. В.


Новосибирск 2011 г.

Задание

Разработать программу для поиска пути в лабиринте.

Предусмотреть возможность задания входа и выхода, наглядное представление найденных решений.

Назначение программного продукта

Данный программный продукт предназначен для выполнения развлекательной функции (демонстрация различных вариантов движения по лабиринту).

Описание данных

DOMAINS

file = fop

Данный домен предназначен для оперирования файлами.

line = integer*

Данный домен предназначен для оперирования списком чисел.

matrix = line*

Данный домен предназначен для оперирования матрицей чисел.

PREDICATES(integer, line, line)

Данный предикат предназначен для получения списка чисел из файла (строки чисел).

getlines (integer, integer, matrix, matrix)

Данный предикат предназначен для получения матрицы чисел (лабиринта) из файла.

getmatrix (integer, matrix)

Данный предикат предназначен для получения лабиринта из файла, это обертка для вышеописанных функций.

reverse (line, line, line)

Данный предикат предназначен реверсии списка.

reverselines (integer, matrix, matrix, matrix)

Данный предикат предназначен для реверсии матрицы.

getelemfromline (line, integer, integer)

Данный предикат предназначен для получения элемента, стоящего на определенной позиции, из списка чисел.

getelem (matrix, integer, integer, integer)

Данный предикат предназначен для элемента из матрицы чисел.

markelemfromline (integer, line, integer, line)

Данный предикат предназначен для изменения элемента в списке.

markelem (integer, matrix, integer, integer, matrix)

Данный предикат предназначен для изменения элемента в матрице чисел.

step (matrix, integer, integer, integer, integer, integer)

Данный предикат предназначен для произведения попытки хода.

operate (integer, matrix, integer, integer, integer, integer, integer)

Данный предикат предназначен для обработки лабиринта и вывода путей.

printline (line, integer)

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

print (matrix, integer, integer)

Данный предикат предназначен для вывода матрицы в файл.

Main

Это главный предикат, обертка для остальных предикатов.

Repeat

Данный предикат предназначен для организации цикла.

case (matrix, integer, integer)

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

Описание методов решения

Метод решения представляет собой перебор всех возможных вариантов ходов из начальной клетки в конечную, при условии, что клетка, в которую совершается перемещение, не является уже пройденной в данном варианте прохода и находится в пределах лабиринта. Ходы будут совершаться до тех пор, пока программа не попадет в конечную клетку.

Описание программы

Программа работает следующим образом:

.Из задаваемого пользователем входного файла считывается структура лабиринта, который задается следующим образом:









Здесь первое число означает количество строк и столбцов, единица означает "стену, а 0 - свободную клетку. Сначала считывается первая строка, затем вторая, и т.д.

2.Считываются координаты клетки отправления и клетки назначения.

3.Выполняется попытка хода в одну из 8 возможных сторон.

5.Если такая клетка не пуста, то попытка считается неудовлетворительной, и перебор продолжается.

.Если клетка пуста, то она отмечается положительным числом, которое означает номер клетки в возможном варианте пути.

.Если клетка является конечной, то лабиринт выводится в текстовый файл lab. txt в форме матрицы, в которой наглядным образом виден путь от начальной клетки до конечной. Затем происходит откат к первой возможной точке возврата (переход к 3 пункту).

.Если клетка не является конечной, то переходим к 3 пункту.

.Если возможных вариантов больше нет, то программа завершает поиск возможных вариантов.

Описание пользовательского интерфейса

Пользовательский интерфейс включает в себя диалог с пользователем, в ходе которого запрашивается имя файла, содержащего лабиринт, координаты клетки отправления и клетки назначения. Вывод путей производится в текстовый файл "lab. txt.

логическое программирование prolog программа

Список использованной литературы

·Новицкая Ю.В. "Основы логического и функционального программирования Электронное учебное пособие.

Приложение

Листинг программы.

DOMAINS

file = fop

line = integer*= line*(integer, line, line)

getlines (integer, integer, matrix, matrix)

getmatrix (integer, matrix)(line, line, line)(integer, matrix, matrix, matrix)(line, integer, integer)(matrix, integer, integer, integer)(integer, line, integer, line)(integer, matrix, integer, integer, matrix)

step (matrix, integer, integer, integer, integer, integer)(integer, matrix, integer, integer, integer, integer, integer)

printline (line, integer)(matrix, integer, integer)(matrix, integer, integer)(0, Line, Line): -

!.(Cnt, OldList, Line): - (Value),= [Value | OldList],= Cnt - 1,getline (NewCnt, Temp, Line).(0, _, NewMatrix, NewMatrix): -

!.(Cnt, MSize, OldMatrix, NewMatrix): - (MSize, [], Line),= [Line | OldMatrix],= Cnt - 1,getlines (NewCnt, MSize, Temp, NewMatrix).(MSize, OutputMatrix): - (MSize),(MSize, MSize, [], OutputMatrix).([], OutputList, OutputList): -

!.([H | T], List, OutputList): -

NewList = [H | List],(T, NewList, OutputList).(0, _, ModifiedMatrix, ModifiedMatrix): -

!.(Cnt, [H | T], TmpMatrix, ModifiedMatrix): - (H, [], ReversedLine),= [ReversedLine | TmpMatrix],= Cnt - 1,reverselines (NewCnt, T, NewMatrix, ModifiedMatrix).

getelemfromline ([H | T], 1, H): -

!.([H | T], J, Elem): - = J - 1,getelemfromline (T, NewJ, Elem).([H | T], 1, J, Elem): -

!, getelemfromline (H, J, Elem).([H | T], I, J, Elem): - = I - 1,getelem (T, NewI, J, Elem).(Mark, [H | T], 1, [Mark | T]): -

!.(Mark, [H | T], J, [H | ModifiedLine]): - = J - 1,markelemfromline (Mark, T, NewJ, ModifiedLine).(Mark, [H | T], 1, J, [NewLine | T]): -

!, markelemfromline (Mark, H, J, NewLine).(Mark, [H | T], I, J, [H | NewMatrix]): - = I - 1,markelem (Mark, T, NewI, J, NewMatrix).

step (Labyrinth, MSize, FromX, FromY, ToX, ToY): - = FromX,= FromY + 1,ToY <= MSize,(Labyrinth, ToX, ToY, Elem),= 0.(Labyrinth, MSize, FromX, FromY, ToX, ToY): - = FromX,= FromY - 1,ToY >= 0,getelem (Labyrinth, ToX, ToY, Elem),= 0.(Labyrinth, MSize, FromX, FromY, ToX, ToY): - = FromX + 1,ToY = FromY + 1,ToX <= MSize,<= MSize,(Labyrinth, ToX, ToY, Elem),= 0.(Labyrinth, MSize, FromX, FromY, ToX, ToY): - = FromX + 1,ToY = FromY,<= MSize,(Labyrinth, ToX, ToY, Elem),= 0.(Labyrinth, MSize, FromX, FromY, ToX, ToY): - = FromX + 1,ToY = FromY - 1,ToX <= MSize,> 0,getelem (Labyrinth, ToX, ToY, Elem),= 0.(Labyrinth, MSize, FromX, FromY, ToX, ToY): - = FromX - 1,ToY = FromY + 1,ToX > 0,ToY <= MSize,(Labyrinth, ToX, ToY, Elem),= 0.(Labyrinth, MSize, FromX, FromY, ToX, ToY): - = FromX - 1,ToY = FromY,> 0,getelem (Labyrinth, ToX, ToY, Elem),= 0.(Labyrinth, MSize, FromX, FromY, ToX, ToY): - = FromX - 1,ToY = FromY - 1,ToX > 0,ToY > 0,getelem (Labyrinth, ToX, ToY, Elem),

Elem = 0.([H], 1): -

!,(H),.([H | T], J): -

NewJ = J - 1,write (H),(" "),

printline (T, NewJ).([H], 1, J): -

!, printline (H, J).([H | T], I, J): - = I - 1,printline (H, J),(T, NewI, J).(Cnt, PathMatrix, MSize, X, Y, I, J): - = I,= J,(Cnt, PathMatrix, X, Y, NewPathMatrix),(NewPathMatrix, MSize, MSize),,.(Cnt, PathMatrix, MSize, X, Y, I, J): - (Cnt, PathMatrix, X, Y, NewPathMatrix),(NewPathMatrix, MSize, X, Y, NewX, NewY),= Cnt + 1,operate (NewCnt, NewPathMatrix, MSize, NewX, NewY, I, J)..: - .(Labyrinth, 1, MSize): - ("Enter starting point"),nl,(X),(Y),("Enter ending point"),nl,(I),(J),(fop, "lab. txt"),(fop),(2, Labyrinth, MSize, X, Y, I, J).(_, 1, _): - _str (fop, "lab. txt"),(fop),.(_, 2, _): -

!.: - ("Input the name of file: "), nl,(Fname),(fop, Fname),(fop),(MSize, MatrixInFile),(fop),(MSize, MatrixInFile, [], Labyrinth),,("Menu: "),nl,("1) Play labyrinth"), nl,("2) Exit"),nl,(Choice),nl,(Labyrinth, Choice, MSize)...

Похожие работы на - Разработка программы с использованием языка логического программирования Prolog

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!