- •Язык программирования турбо пролог
- •4.4. Переопределение стандартного ввода-вывода
- •4.5. Работа с файлами
- •5. Внутренняя база данных турбо пролога
- •5.1. Объявление внутренней базы данных
- •5.2. Обновление внутренней базы данных
- •5.3. Занесение фактов во время исполнения.
- •5.4. Удаление фактов во время выполнения программы
- •506 Type Error: The functor does not belong to the domain (функтор не относится к данному домену)
- •5.5. Чтение новых фактов иэ файла во время выполнения программы
- •5.6. Сохранение базы данных во время работы программы
- •6. Трассировка и отладка пролог программ
- •6.1. Синтаксическая проверка
- •6.2. Трассировка
- •6.2.1. Директивы трассировки
- •6.2.2. Трассировка в режиме оптимизации: shorttrace
- •6. 2. 3. Трассировка предикатов
- •6.2.4. Предикат trace
- •6.2.5. Диалоговое управление трассировкой
- •6.3. Директивы компилятора и отладка
- •6.4. Сообщения об ошибках во время выполнения программы
- •6.5. Опции компилятора из меню
- •7.Заключение
- •8. Литература:
- •Содержание:
506 Type Error: The functor does not belong to the domain (функтор не относится к данному домену)
Следующая цель из иллюстрирует, как вы можете получить значения предиката retract:
goal
retract(person( Name, Age)),
write(Name, ", ", Age),
fail.
Пользователь может также удалить все факты из заданной секции database с помощью предиката retract. Если в предикате retract в качестве первого аргумента будет указана свободная переменная, то, чтобы определить, из какой секции database нужно произвести удаление, он будет анализировать второй аргумент. Например: goal
retract( X, mydatabase),
write(X),
fail.
Предикат retractall удаляет из вашей базы данных все факты, совпадающе с образцом <факт>. Этот предикат всегда завершается успешно. Из retractsll выходные значения получить нельзя. Это оз-начает, что как и в случае not для не связанных переменных нужно использовать символ подчеркивания,
retractall имеет следующий формат:
retractall (< факт> [, databaseNamel)
Так же как в случае предикатов assert и retract, для проверки типа можно использовать второй аргумент. И, как в случае предиката retract, если при вызове retractall используется символ подчеркивания, то из указанной секции database можно удалить все факты.
Следующая цель удаляет все факты о мужчинах из базы данных с фактами person:
retractalI (person( _; _, male,_)).
Следующая цель удаляет все факты из базы mydatabase:
retractall( _,mydatabase).
5.5. Чтение новых фактов иэ файла во время выполнения программы
Предикат consult считывает из файла (fileName) факты, описанные в секции database, и вставляет их в программу в конец соответствующей базы данных (аналогично тому, как предикат assertz включает факты.) Предикат consult имеет один или два аргумента:
consult(fileName) /*(i) */
consult(fileName, databaseName) /*(i,i) */
Однако в отличие от assertz, если вы вызовите consult только с одним аргументом (без имени базы данных), то будут считаны только факты, которые были описаны в секции беэ имени (по умолчанию dbasedom).
Если вы вызовите consult с двумя аргументами (имя файла и имя базы данных), будут только проверены факты из указанной базы данных. Если файл содержит что-нибудь кроме фактов указанной базы, предикат consult выдаст сообщение об ошибке.
Обратите внимание, что предикат consult считывает по одному факту. Если файл содержит десять фактов, а в седьмом факте имеется какая-нибудь синтаксическая ошибка, consult занесет шесть первых фактов в базу данных, после чего выдаст сообщение об ошибке.
Отметим, что предикат consult может считывать файлы только в том формате, который создает save (для включения фактов с максимально возможной скоростью). Файлы не должны содержать:
прописных символов;
пробелов за исключением тех, которые содержатся внутри строк в двойных кавычках; .
комментариев;
пустых строк;
символов без двойных кавычек.
5.6. Сохранение базы данных во время работы программы
Предикат save сохраняет факты из указанной базы данных в файле. Этот предикат имеет один или два аргумента:
save(fileName) /* (i) */
save(fileName, databaseName) /*(i,i) */
При вызове предиката save только с одним аргументом (без имени базы данных) в файле fileName будут сохранены факты из базы данных dbasedom, используемой по умолчанию.
При вызове предиката save с двумя аргументами (имя файла и имя базы данных) в указанном файле будут сохранены факты из database секции databaseName.
Пример. Это пример того, как с помощью внутренней базы данных написать экспертную систему. Существенной особенностью данного примера является то, здесь вы можете добавлять знания (и удалять их) во время работы программы.
donains
thing = string
conds = cond*
cond = string
database
is_a(thing,thing,conds)
type_of(thing,thing,conds)
false (cond)
predicates
run( thing)
ask(conds)
clauses
run(Item) :-
is_a(X, Item, List),
ask(List),
type_of(AnS, X, List2),
ask(List2),
write("The ", Item," you need is a/an ",Ans), nl.
run( _) : -
write("This program does not have enough "),
write("data to draw any conclusions. "),nl. ask([]). ask([H£TJ) :-
not(false(H)),
write("Does this thing help you to "),
write(H," (enter y/n)"),
readchar(Ans), nl, Ans='y',
ask(T). ask(CH£J) :- .
assertz( false( H)), fail.
Следующие факты, могли быть занесены с помощью предикатов asserta, или assertz, или считаны из файла с помощью предиката consult. Однако в этом примере они расположены в секции clauses.
is_a(language, tool, ["communicate"]).
is_a(hammer, tool, ["build a house", "fix a fender","crack a
nute"]).
is_a(sewing_machine, tool, ["make clothing","repair sails"]). is_a(plow, tool, ["prepare fields", "farm"]). type_of(english, lahguage, ["communicate with people"]), type_of(prolog,lahguage, ["communicate with a computer"]).
После приглашения goal: введите: ..•
run(tool).
Отвечайте на каждый вопрос так, как будто вы хотите найти некоторое средство общения с компьютером.
На следующее приглашение goal: введите:
retract(type_of(prolog, language, ["communicate with a
computer"])), asserta(type_of("turbo prolog", language,
["communicate with personal computer"])), asserta( type_of (prolog, language,
["communicate with a mainframe computer"])),run(tool).
Эта цель удалит факт:
type65f(prolog, language, ["communicate with a computer"!) из внутренней базы данных и добавляет два новых факта:
type_of(prolog, language,["communicate with a mainframe
computer"!). type_of("turbo prolog", language,
["communicate with personal computer"]).
Теперь снова отвечайте на каждый вопрос так, как будто вы хотите найти некоторый язык общения с компьютером.
С помощью вызова предиката save с именем файла в качестве его аргумента можно сохранить всю базу данных в текстовом файле. Например, после вызова:
save("mydata. dba")
файл MYDATA, DBA будет аналогичен секции clauses обычной программы Турбо Пролога, и каждый факт будет содержаться строке. С помощью предиката consult можно считать этот файл в память:
consult( "mydata. dba")