- •Введение
- •1. Организация вычислительного процесса
- •2. Основные элементы языка
- •2.1. Имена
- •2.2. Типы данных
- •2.3. Константы и переменные
- •2.4. Программные секции Пролога
- •2.4.1. Секция Domains
- •2.4.2. Секция Ppredicates
- •2.4.3. Секция Database
- •2.4.4. Секция Clauses
- •2.4.5. Секция Goal
- •3. Примеры программ
- •3.1. Программы с фактами и простыми правилами
- •3.2. Рекурсии
- •3.3. Программирование циклов
- •3.4. Работа со списками
- •3.5. Нахождение пути на графе
- •3.6. Использование структур
- •Vife(X):–family(_,X,_). % X – жена
- •3.7. Динамическая база данных
- •It_is("хищник"),
- •Xpositive(X, y), !. % в базе данных
- •3.8. Обработка текстов
- •Verb( string ) % Глагол
- •4. Стандартные предикаты
- •4.1. Ввод/вывод
- •4.2. Управление экраном и оконная система
- •4.3. Обработка строк
- •4.4. Преобразование типов
- •4.5. Работа с базой данных
- •4.6. Управляющие предикаты
- •4.7. Прочие стандартные предикаты
- •4.8. Арифметические и логические предикаты
- •5. Использование языка Пролог для построения экспертных систем
- •5.1. Оболочка экспертной системыGeni
- •5.2. Оболочка экспертной системы pexpert
- •5.2.1. Синтаксис правил
- •5.2.2. Функции
- •5.2.3. Взгляд на работу программы
- •5.2.4. Команды верхнего уровня
- •5.2.5. Команды оценки правил
- •5.2.6. Команды, действующие во время ввода данных
- •Рекомендуемая литература
- •Приложение. Варианты лабораторных работ Лабораторная работа 1. Работа с простой базой данных
- •Лабораторная работа 2. Программа “Родственные отношения”
- •Лабораторная работа 3. Построение простой вопросно-ответной системы
- •Лабораторная работа 4. Работа со списками
- •Лабораторная работа 5. Нахождение пути на графе
- •Лабораторная работа 6. Работа с базой данных с использованием структур
- •Лабораторная работа 7. Построение экспертной системы
- •Лабораторная работа 8. Построение синтаксического анализатора
Verb( string ) % Глагол
DOMAINS % Описание грамматики
DETERM = none ; determ( STRING )
NOUNP = nounp( DETERM, STRING, RELCL)
RELCL = none ; relcl( STRING, VERBP )
SENTENCE = sent( NOUNP, VERBP )
VERBP = verb( STRING ) ; verbp( STRING, NOUNP )
TOKL = STRING*
PREDICATES
is_det( STRING )
is_noun( STRING )
is_rel( STRING )
is_verb( STRING )
s_determ( TOKL, TOKL, DETERM )
s_nounp( TOKL, TOKL, NOUNP )
s_relcl( TOKL, TOKL, RELCL )
s_sentence( TOKL, TOKL, SENTENCE )
s_verbp( TOKL, TOKL, VERBP )
tokl( STRING, TOKL )
tom(TOKL)
run1
run2(STRING)
sen_an
GOAL makewindow(1,6,0,"",0,0,25,80),
sen_an.
CLAUSES
sen_an:– write("Try: every man that lives loves a woman"),
readln(LIN), LIN >< "" ,
tokl(LIN,TOKL),
s_sentence( TOKL, _, SENT),
write("PROLOG OBJECT=",SENT," "),
readchar(_),clearwindow,!.
tokl(STR,[TOK|TOKL]) :–
fronttoken(STR,TOK,STR1),
tokl(STR1,TOKL).
tokl(_,[ ]).
s_sentence(TOKL,TOKL2,sent(NOUNP,VERBP)):–
s_nounp(TOKL,TOKL1,NOUNP),
s_verbp(TOKL1,TOKL2,VERBP),
TOKL2=[ ],!.
s_sentence(_,_,_):–write(">> Sentence not recognized \n"),fail.
% Группа подлежащего
s_nounp(TOKL,TOKL2,nounp(DETERM,NOUN,RELCL)):–
s_determ(TOKL,[NOUN|TOKL1],DETERM),
is_noun(NOUN),
s_relcl(TOKL1,TOKL2,RELCL).
% Определитель
s_determ([DETERM|TOKL],TOKL,determ(DETERM)):–
is_det(DETERM).
s_determ(TOKL,TOKL,none).
% Группа дополнения
s_relcl([REL|TOKL],TOKL1,relcl(REL,VERBP)):–
is_rel(REL),
s_verbp(TOKL,TOKL1,VERBP).
s_relcl(TOKL,TOKL,none).
% Группа сказуемого
s_verbp([VERB|TOKL],TOKL1,verbp(VERB,NOUNP)):–
is_verb(VERB),
s_nounp(TOKL,TOKL1,NOUNP).
s_verbp([VERB|TOKL],TOKL,verb(VERB)):–
is_verb(VERB).
is_noun(X):–noun(X),!.
is_noun(X):–noun(Y),concat(Y,"s",X).
is_det(X):–det(X).
is_rel(X):–rel(X).
is_verb(X):–verb(X),!.
is_verb(X):–verb(Y),concat(Y,"s",X),!.
is_verb(X):–verb(Y),concat(Y,"ed",X),!.
is_verb(X):–verb(Y),concat(Y,"es",X),!.
is_verb(X):–verb(Y),concat(Y,"ing",X).
% Словарь
det("every").
det("a").
noun("man").
noun("woman").
rel("that").
rel("who").
rel("whom").
rel("which").
rel("that").
verb("love").
verb("live").
4. Стандартные предикаты
Одной из основных причин, которые помогли Прологу стать "реальным" языком программирования, было введение в язык элементов, лежащих за пределами чистой логики. В Турбо-Прологе такие элементы реализованы как стандартные (встроенные) предикаты.
Большинство стандартных предикатов выполняет несколько функций в зависимости от состояния параметров, входящих в предикат. В одном случае заранее определен какой-либо один параметр, в другом случае известны другие параметры, иногда к моменту обращения могут быть известны все параметры. Известные параметры предиката называются входными, неизвестные – выходными. Совокупность входных и выходных параметров определяет работу предиката. Эта совокупность называется поточным шаблоном. Если предикат будет вызываться с двумя аргументами, имеется четыре варианта поточного шаблона:
(i,i) (i,o) (o,i) (o,o),
где i– входной параметр,о– выходной параметр. Однако не для каждого предиката все возможные варианты поточного шаблона имеют смысл.
Hиже приводятся некоторые наиболее часто употребляемые стандартные предикаты, сгруппированные в отдельные классы по их функциональному назначению. Более полный список стандартных предикатов можно найти в [3].