Вы находитесь на странице: 1из 7

МИНИСТЕРСТВО ПРОСВЕЩЕНИЯ И МОЛОДЁЖИ

РЕСПУБЛИКИ МОЛДОВА
ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ РЕСПУБЛИКИ МОЛДОВА
Физический Факультет
Кафедра Прикладной Физики и Информатики

Лабораторная работа №1

Факты, правила, вопросы в Прологе.

студент IV курса
специальности Информационные технологии
Олейник Александра

работу проверил:
доктор конференциар
Пелин Николай Иванович

Кишинёв – 2010
Цель работы
Исследование фактов и вопросов на основе генеалогического древа в
среде Turbo Prolog.

Краткая теория

Дизъюнкт – это дизъюнкция n-количества элементарных формул логики


высказываний.

Конъюнктивная нормальная форма (КНФ) — нормальная форма, в


которой булева формула имеет вид конъюнкции нескольких дизъюнктов. Эта
форма обладает особенностью : если хоть один из дизъюнктов является ложью,
то вся форма является ложной. Любая формула логики высказываний может быть
преобразована в КНФ.

Дизъюнкт Хорна — дизъюнкция литералов с не более чем одним


положительным литералом. Исходя из определения дизъюнкта Хорна, имеем 3
частных случая:
• Когда имеем одну положительную литеру и ни одной негативной – это
унарный дизъюнкт Хорна;
• Когда имеем одну положительную и одну или более отрицательных литер
– это точный дизъюнкт Хорна;
• Когда не имеем ни одной положительной литеры, т.е. все литеры
отрицательные – это негативный дизъюнкт Хорна;

Резолюция – правило вывода через поиск противоречий. Если для двух


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

Унификация — подстановка значений вместо переменных при выводе логической


формулы.

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

Использование встроенные предикаты:


• write(X,”text”) – позволяет выводить на экран информацию, где Х –
переменная, text – произвольная строка текста.
• readln(X) – ввод пользователем информации в программу, где X – строка
текста.
• Предикат отсечения cut обозначается с помощью символа !. Он позволяет
получить доступ только к части данных, устраняя дальнейшие поисковые
действия.
• Предикат fail называют откатом после неудачи. Он вызывает искусственное
неуспешное завершение поиска, что позволяет получить все возможные
решения задачи.
• makewindow(WindowNo,ScrAtt,FrameAtt,Framestr,
Row,Column,Height,Width,ClearWindow,FrameStrPos,BorderChars)
(integer,integer,integer,string,
integer,integer,integer,integer,integer,integer,string)
Построение окна или опрос его атрибутов, где
WindowNo - номер окна
ScrAtt - цвет окна
FrameAtt - цвет рамки
Framestr - заголовок
Row,Column - координаты верхнего левого угла окна
Height,Width - высота и ширина окна
ClearWindow = 0 - не очищать окно после построения,
= 1 - очистить окно после построения
FrameStrPos = 255 - расположение заголовка в центре окна;
<> 255 - расположение заголовка относительно
начала окна
BorderChars - строка из 6 символов для построения рамки
окна.
1-й символ: верхний левый символ рамки
2-й символ: верхний правый символ рамки
3-й символ: нижний левый символ рамки
4-й символ: нижний правый символ
5-й символ: символ горизонтальной линии
6-й символ: символ вертикальной линии

План выполнения работы

1. Составить своё минимальное и достаточное генеалогическое дерево до


четвёртого поколения.
2. На основе полученного графа, создать логическую модель программы на
языке пролог.
3. Исследовать связь родитель/ребёнок с целью установления максимального
количества вопросов на русском языке и языке логики.
4. Запустить режим трассировки и запротоколировать все шаги, выполняемые
интерпретатором в режиме trace.

Ход работы
Трасировка по родителю Сергей.
Call: parent (“sergei”,_)
RETURN *parent (“sergei”,”sasha”)
REDO parent(“sergei”,_)
RETURN *parent (“sergei”,”mia”)

Выводы

В ходе выполнения работы были рассмотрены основные возможности


языка пролог. Были изучены и использованы ряд стандартных предикатов: для
вывода информации на экран(write), для отсечения всех выводимых ответов,
кроме первого(cut), а так же вывод всех возможных ответов(fail), и предикат для
создания окон (makewindow). Было разработано генеалогическое дерево, на
основе которого были рассмотрены все возможные вопросы на логическом языке
по отношению родитель – ребёнок.
Листинг программы
domains
name=symbol

predicates
analiz(integer)
menu

parent(name,name)
child(name,name)
grandparent(name,name)
grandchild(name,name)
greate_grandparent(name,name)
greate_grandchild(name,name)
sister_brother(name,name)
couple(name,name)
uncle_aunt(name,name)
nephew(name,name)
cousin(name,name)

clauses

parent(sergei,sasha).
parent(valentina,sasha).
parent(sergei,mia).
parent(valentina,mia).
parent(petr,nikolai).
parent(liza,nikolai).
parent(petr,anastasia).
parent(liza,anastasia).
parent(ivan,petr).
parent(ekaterina,petr).
parent(nikolai,valentina).
parent(maria,valentina).
parent(ivan,marina).
parent(ekaterina,marina).
parent(ghenadii,sergei).
parent(irina,sergei).
parent(kiril,irina).
parent(kira,irina).
parent(kiril,elena).
parent(kira,elena).
parent(oliga,ghenadii).
parent(konstantin,ghenadii).
parent(vladimir,ekaterina).
parent(anna,ekaterina).
parent(alexandr,ivan).
parent(iana,ivan).
parent(alexandr,filip).
parent(iana,filip).

child(X,Y):-parent(Y, X).
sister_brother(X,Y):-parent(Z,X),parent(Z,Y),X<>Y,!.
couple(X,Y):-parent(X, Z),parent(Y, Z),X<>Y.
uncle_aunt(X,Y):-parent(Z, Y),sister_brother(X, Z).
nephew(X,Y):-uncle_aunt(Y,X).
cousin(X,Y):-parent(Z,X),parent(Q,Y),sister_brother(Z,Q).
grandparent(X,Y):-parent(X,Z),parent(Z,Y).
grandchild(X,Y):-grandparent(Y,X).
greate_grandparent(X,Y):-grandparent(X,Z),parent(Z,Y).
greate_grandchild(X,Y):-greate_grandparent(Y,X).

analiz(X):-X=1, write("Enter a child"),


nl,readln(Z),parent(Y,Z),
write(Y),readln(_),nl,fail,menu.
analiz(X):-X=2, write("Enter a parent"),
nl,readln(Z),parent(Z,Y),
write(Y),readln(_),fail,nl,menu.
analiz(X):-X=3, write("Enter a person of couple"),
nl,readln(Z),couple(Z,Y),
write(Y),readln(_),fail,nl,menu.
analiz(X):-X=4, write("Enter a person"),
nl,readln(Z),sister_brother(Y,Z),
write(Y),readln(_),fail,nl,menu.
analiz(X):-X=5, write("Enter a nephew"),
nl,readln(Z),uncle_aunt(Y,Z),
write(Y),readln(_),fail,nl,menu.
analiz(X):-X=6, write("Enter an uncle/aunt"),
nl,readln(Z),nephew(Y,Z),
write(Y),readln(_),fail,nl,menu.
analiz(X):-X=7, write("Enter a person"),
nl,readln(Z),cousin(Y,Z),
write(Y),readln(_),fail,nl,menu.
analiz(X):-X=8, write("Enter a grandchild"),
nl,readln(Z),grandparent(Y,Z),
write(Y),readln(_),fail,nl,menu.
analiz(X):-X=9, write("Enter a grandparent"),
nl,readln(Z),grandchild(Y,Z),
write(Y),readln(_),fail,nl,menu.
analiz(X):-X=10,write("Enter a greate-grandchild"),
nl,readln(Z),greate_grandparent(Y,Z),
write(Y),readln(_),fail,nl,menu.
analiz(X):-X=10,write("Enter a greate-grandparent"),
nl,readln(Z),greate_grandchild(Y,Z),
write(Y),readln(_),fail,nl,menu.

analiz(X):-X=0.

menu:-clearwindow,makewindow(1,7,7,"dialog",0,0,25,70),
write("chose a question:"),nl,
write("1 Find a parent"),nl,
write("2 find a child"),nl,
write("3 find a couple"),nl,
write("4 find a siter/brother"),nl,
write("5 find an uncle/aunt"),nl,
write("6 find a nephew"),nl,
write("7 find a cousin"),nl,
write("8 find a grandparent"),nl,
write("2 find a grandchild"),nl,
write("10 find a greate-grandparent"),nl,
write("11 find a greate-grandchild"),nl,
write("0 Exit"),nl,
readint(X),analiz(X).

goal
menu.

Вам также может понравиться