Ответы по информатике

Автор: Пользователь скрыл имя, 02 Декабря 2011 в 22:02, шпаргалка

Описание работы

Ответы на 9 вопросов.

Работа содержит 1 файл

Шпора СИИ.docx

— 61.68 Кб (Скачать)

Список –  это объект, который содержит внутри себя упорядоченный набор других объектов, следующих друг за другом. Порядок следования элементов в  списке играет важную роль при унификации и является значимым: те же элементы, упорядоченные другим способом, представляют совсем другой список. Списки имеют  произвольную длину, т.е. количество элементов  в списке может меняться, единственным ограничением является объем оперативной памяти Составляющие списка внутренне связаны между собой, поэтому можно работать как с группой объектов (списком в целом), так и с индивидуальными объектами (элементами списка). Объявление списков

Для того, чтобы сформировать структуру данных типа список, необходимо разделить его элементы запятыми и заключить их в квадратные скобки ([ ]). Примеры списков:

[dog, cat, canary] % список элементов типа symbol

["valerie ann", "jennifer caitlin", "benjamin thomas"]% cписок строк

[3.2, 4.6 ,1.1, 2.64]% список целых чисел

[1, 2, 3, 6, 9, 3, 4]% список вещественных чисел

Объявление  домена (области) списка имеет вид:

DOMAINS

integerlist = integer*  % список целых чисел

classes = symbol*   % список элементов типа symbol

Звездочка (*) является признаком списка, а integerlist и classes – названия (имена) списков, причем оно может быть произвольным (например, вы можете назвать свой список zanzibar).

DOMAINS

bird_list = bird_name*   % список “название птицы”

bird_name = symbol

number_list = number*   % cписок number_list

number = integer

PREDICATES

birds(bird_list)

score(number_list)

CLAUSES

birds(["sparrow", "robin”, "mocidngbird", "thunderbird", "bald eagle"]).

score([56,87,63,89,91,62,85]).

GOAL

birds(All),

birds([_,_,_,B,_ ]),

score([First,Second,_,_,_,_,Last]).

Система возвратит ответы:

All=["sparrow","robin","mocidngbird","thunderbird","bald eagle"], B=thunderbird, First=56, Second=87, Last=85

1 Solution

10.Динамические базы данных Пролог-программы. Описание, добавление фактов, удаление фактов. Примеры.Динамическая (внутренняя) база данных системы Visual Prolog состоит из фактов, которые можно добавлять и удалять из программы непосредственно во время ее выполнения (отсюда название “динамическая база”). В такую базу можно время от времени вносить изменения, отражающие модификацию структуры описываемой системы. Динамическая база данных незаменима при проектировании таких приложений искусственного интеллекта как экспертные системы, которые сохраняют большие объемы вспомогательной информации, подлежащей удалению при выходе из режима консультации.Предикаты, описывающие внутреннюю базу данных, объявляются в разделе facts (database) и используются так же, как предикаты, объявленные в разделе predicates. Система имеет набор встроенных предикатов, предназначенных для работы с внутренними базами фактов (например, для добавления новых фактов в базу данных Пролога используются  встроенные предикаты assert, asserta, assertz, а предикаты retract и retractall удаляют соответствующие факты из базы. Объявление внутренней базы данных.Раздел объявления предикатов внутренней базы данных программы начинается с ключевого слова facts или database. Во время выполнения программы во внутреннюю базу данных можно добавлять факты (но не правила). Пример раздела facts:

DOMAINS

name, address = string

age = integer

gender = male ; female

FACTS

person(name, address, age, gender)

PREDICATES

male(name, address, age)

female(name, address, age)

child(name, age, gender)

CLAUSES

male(Name, Address, Age) :-

person(Name, Address, Age, male).

Поскольку всякая реляционная  база данных представляется Прологом в виде коллекции  фактов, для доступа  к таким базам  можно использовать язык запросов. Механизм унификации системы автоматически выбирает факты с заданными значениями аргументов и присваивает значения неопределенным параметрам, а механизм перебора с возвратами может находить все решения для данного запроса. К предикатам динамической базы данных обращаются так же, как к другим предикатам программы (единственое видимое различие между этими предикатами – это то, что объявления первых находятся в разделе database, а объявления вторых - в разделе predicates). Пример:

DOMAINS

name = string

sex = char

DATABASE

person(name,sex)

CLAUSES

person("Helen",'F').

person("Maggie",'F').

person("Suzanne",'F').

person("Per",'M').

Добавление  фактов во время выполнения программы.

Система Visual Prolog предоставляет программисту возможность непосредственно во время выполнения программы добавлять в базу данных факты, предикаты которых описаны в разделе database. Для добавления одиночного факта в динамическую базу применяются предикаты asserta и assertz, имеющие следующий синтаксис:

asserta(<the fact>)                                                                % добавить в начало базы 

asserta(<the fact>, databaseName)

assertz(<the fact>)                                                                % добавить в конец базы

assertz(<the fact>, databaseName)  

Предикат  аsserta помещает новый факт в начало динамической базы данных (перед всеми существующими фактами для данного предиката), а предикат assertz – в конец базы. Данные предикаты всегда знают, в какую динамическую базу вставлять факт, т.к. имена предикатов каждой базы данных являются уникальными внутри программы. Необязательный второй параметр databaseName явно указывает динамическую базу данных, в котоую следует вставить факт (гарантирунт то, что Вы работаете с нужной базой данных). Рассмотрим пример

assertz(person("Suzanne", "New Haven", 35)).

asserta(person("Michael", "New York", 26)).

assertz(likes("John", "money"), likesDatabase).

asserta(likes("Shannon", "hard work"), likesDatabase).

Первый  предикат assertz вставляет утверждение про Сюзанну в конец динамической базы фактов предиката person. Второй предикат asserta помещает факт (относительно Майкла) перед всеми существующими на данный момент фактами для person. Третий предикат вставляет факт, касающийся Джона, в конец другой внутренней базы данных likesDatabase (хранит утверждения для предиката likes), в то время как четвертый помещает утверждение про Шеннона в начало базы likesDatabase.

После выполнения этих предикатов динамические базы данных имеют вид:

/* Internal database -- dbasedom */

person("Michael", "New York", 26).

/* ... other person facts ... */

person("Suzanne", "New Haven", 35).

/* Internal database -- likesDatabase */

likes("Shannon", "hard work").

/* ... other likes facts ... */

likes("John", "money").

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

Удаление  фактов

Предикат  retract удаляет содержащийся в динамической базе данных факт. Синтаксис предиката:

retract(<the fact>[, databaseName])  

Данный  предикат удалит первое утверждение базы данных, соответствующее  факту <the fact> и унифицирует свободные переменные из <the fact> значениями, содержащимися в удаляемом факте. Таким образом, предикат retract осуществляет доступ к хранимой в динамической базе информации с последующим удалением факта.

Предположим, имеется такая программа:

DATABASE

person(string, string, integer)

DATABASE - likesDatabase

likes(string, string)

dislikes(string, string)

CLAUSES

person("Fred", "Capitola", 35).

person("Fred", "Omaha", 37).

person("Michael", "Brooklyn", 26).

likes("John", "money").

likes("Jane", "money").

likes("Chris", "chocolate").

likes("John", "broccoli").

dislikes("Fred", "broccoli").

dislikes("Michael", "beer").

Зададим программе такие  цели:

retract(person("Fred", _, _)). % 1 

retract(likes(_, "broccoli")). % 2 

retract(likes(_, "money"), likesDatabase). % 3

retract(person("Fred", _, _), likesDatabase). % 4

Первая  цель удаляет первый факт предиката  person - person("Fred", "Capitola", 35) - из заданной по умолчанию базы dbasedom. Вторая цель удаляет факт likes("John", "broccoli").из базы данных likesDatabase. Выполняя эти цели система знает, из какой базы данных удалять факты, т.к. имена предикатов этих баз являются уникальными: предикат person может храниться только в заданной по умолчанию базе, а предикат likes - только в базе данных likesDatabase.

Третья  и четвертая цели иллюстрируют, как  можно использовать необязательный параметр для контроля соответствия типов. Третья цель истинна, т.к. в базе данных likesDatabase существует likes факт со вторым аргументом, равным "money" (в данном случае удаляется первый факт likes("John", "money")), а четвертая цель возвращает ошибку, потому что в базе данных likesDatabase не существует фактов для предиката person.

Следующая цель демонстрирует  получение информации с помощью предиката  retract:

GOAL

retract(person(Name,_,Age)),

write(Name, ", ", Age),nl,

fail.

Возвращаемые  значения:

Fred, 35

Fred, 37

Michael, 26

No Solution

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

retract(X, likesDatabase),

write(X),nl,

fail.

Ответ системы

likes("John","money")

likes("Jane","money")

likes("Chris","chocolate")

likes("John","broccoli")

dislikes("Fred","broccoli")

dislikes("Michael","beer")

No Solution

Информация о работе Ответы по информатике