Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по языку Пролог.doc
Скачиваний:
83
Добавлен:
28.06.2014
Размер:
507.39 Кб
Скачать

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")