Решение логических задач на Прологе.



Задания на лабораторную работу

Вариант 1.

1) Смит, Джонс и Робинсон работают в одной поездной бригаде: машинистом, кондуктором и кочегаром. Профессии их названы не обязательно в том же порядке, что и фамилии. В поезде, который обслуживает бригада, едут трое пассажиров с теми же фамилиями. Для того, чтобы отличить пассажиров от персонала, будем добавлять перед их фамилиями уважительное "мистер".

Известно следующее:

1. Мистер Робинсон живет в Лос-Анджелесе.

2. Кондуктор живет в Омахе.

3. Мистер Джонс давно позабыл всю алгебру, которой его учили в колледже.

4. Пассажир - однофамилец кондуктора - живет в Чикаго.

5. Кондуктор и один из пассажиров, известный математик, ходят в одну церковь.

6. Смит всегда выигрывает у кочегара, когда им случается встречаться за партией в биллиард.

Как фамилия машиниста?

 

2) Однажды в Артеке за круглым столом оказалось пятеро ребят из Москвы, Санкт-Петербурга, Новгорода, Перми, Томска: Денис, Игорь, Иван, Алеша, Сергей. Москвич сидел между томичем и Сергеем, санкт-петербуржец - между Денисом и Игорем, а напротив него сидел пермяк и Иван. Алеша ни разу не был в Санкт-Петербурге, а Денис не бывал в Москве и Томске, а томич с Игорем регулярно переписываются. Определите, кто в каком городе живет каждый из ребят.

Вариант 2.

1) Однажды три профессора, профессор Иванов, профессор Петров и профессор Сидоров, сидели в небольшом кафе и разговорились с местным персоналом. Оказалось, что бармен, официант и повар - однофамильцы профессоров (будем их называть просто Иванов, Петров и Сидоров без титула). Кроме того, выяснилось, что:

1. Профессор Иванов живет на проспекте Культуры.

2. Профессор, который является однофамильцем официанта, живет на Рижской улице.

3. Зарплата проф. Петрова - 35 тысяч.

4. Официант живет на улице Заречной.

5. Сидоров на прошлой неделе обыграл повара в карты.

6. Зарплата профессора, который живет рядом с официантом, ровно в три раза больше зарплаты официанта.

 

Как зовут бармена?

2) Аркадий, Борис, Николай и Владимир развлекались перетягиванием каната. Борис мог перетянуть Аркадия и Николая, вместе взятых. Если с одной стороны становились Борис и Аркадий, а с другой - Николай и Владимир, то ни та, ни другая пара не могла перетянуть канат на свою сторону. Но если Николай и Аркадий менялись местами, Владимир и Аркадий легко побеждали противников.

Кто из них был самый сильный, кто занимал второе место, кто третье, кто самый слабый?

 

Вариант 3.

1) Известно, что один из трёх знаменитых в Чикаго гангстеров, клички которых Арчи, Босс и Весли, украл портфель с крупной суммой денег. На допросе каждый из них сделал три заявления.

Арчи: 1. Я не брал портфель. 2. В день кражи я уезжал из Чикаго. 3. Портфель украл Весли.

Босс: 1. Портфель украл Весли. 2. Если б я и взял его, то не сознался бы. 3. У меня и так много денег.

Весли: 1. Я не брал портфель. 2. Я давно ищу хороший портфель. 3. Арчи прав, он уезжал из Чикаго.

В ходе следствия выяснилось, что у каждого из трёх заявлений два верных, а одно нет. Кто украл портфель?

2) На улице, встав в кружок, беседует четыре девочки: Аня, Валя, Надя, Галя. Девочка в зеленом платье – не Аня и не Валя - стоит между девочкой в голубом платье и Галей. Девочка в белом платье стоит между девочкой в розовом платье и Валей. Какого цвета платье у каждой из девочек?

 

 

Вариант 4.

1) Один раз на стройке пропали кирпичи. Прораб, возмущённый тем, что кирпичи пропали без его ведома, решил выяснить кто же решился на такой дерзкий поступок. Выяснилось, что кирпичи могли украсть или монтажник Выпивайко или крановщик Наливайко или маляр Закусывайко. Прораб, с редкой фамилией Иванов, выяснил, что укравший кирпичи был левша. Каждый из трёх подозреваемых сделал по два утверждения:

 

Выпивайко: Я не левша. Я не брал кирпичи.

Наливайко: Я левша. Я не брал кирпичи.

Закусывайко: Я не левша. Левша брал кирпичи.

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

 

2) Три друга заняли первое, второе, третье места в соревнованиях универсиады. Друзья разной национальности, зовут их по-разному, и любят они разные виды спорта. Майкл предпочитает баскетбол и играет лучше, чем американец. Израильтянин Саймон играет лучше теннисиста. Игрок в крикет занял первое место. Кто является австралийцем? Каким спортом увлекается Ричард?

 

Вариант 5.

1) На заводе работали три друга: слесарь, токарь и сварщик. Их фамилии Борисов, Иванов и Семенов. У слесаря нет ни братьев, ни сестер. Он самый младший из друзей. Семенов, женатый на сестре Борисова, старше токаря. Назвать фамилии слесаря, токаря и сварщика.

2) Воронов, Павлов, Левицкий и Сахаров – четыре талантливых молодых человека. Один из них танцор, другой художник, третий-певец, а четвертый-писатель. О них известно следующее: Воронов и Левицкий сидели в зале консерватории в тот вечер, когда певец дебютировал в сольном концерте. Павлов и писатель вместе позировали художнику. Писатель написал биографическую повесть о Сахарове и собирается написать о Воронове. Воронов никогда не слышал о Левицком. Кто чем занимается?

 

 

Вариант 6.

1) У четырех школьников следующие имена: Петр, Андрей, Федор и Иван. Фамилии: Петров, Андреев, Федоров, Иванов. Ни у кого из них собственные имя и фамилия не одинаковые. У Андреева имя не Иван. Имя школьника с фамилией Федоров - фамилия (почти) школьника, чье имя фамилия Петра. Определите фамилии и имена школьников.

2) Четыре супружеские пары обедали вместе. После десерта Диана выкурила три сигареты, Елизабет - две, Николь - четыре и Мод - одну сигарету. Симон выкурил столько, сколько и его жена, Пьер - вдвое больше своей жены, Луи - в три раза больше своей жены и Кристиан - в 4 раза больше своей жены.
Если все присутствующие выкурили вместе 32 сигареты, то не могли бы вы сказать, как зовут жену Луи?

 

Вариант 7.

3. В кафе зашли Лида, Аня, Настя, Оля. Перед стойкой стоят 4 стула: синий, зеленый, красный, желтый. Синий стоит около красного и того, на который сядет Оля. Желтый стул стоит с краю. Оля не сядет на зеленый стул. Настя сядет только между Лидой и синим стулом. Выясните, на каких стульях будут сидеть девушки. Укажите имена девушек, в каком порядке они сели на красный, зеленый, синий и желтый стул соответственно.

4. В семье 4 ребенка. Младшему 5, старшему 15 лет. Двум другим 8 и 13 лет. Имена детей: Боря, Галя, Вера и Аня. Какой возраст каждого ребенка, если одна девочка ходит в детский сад. Аня старше Бори. Сумма лет Ани и Веры делится на 3.

 

Вариант 8.

3) Трое юношей: Коля, Дима и Юра влюблены в трех девушек: Аню, Лену, Вику. Но эта любовь без взаимности. Коля любит девушку, влюбленную в юношу, который любит Лену. Дима любит девушку, влюбленную в юношу, который любит Вику. Лена не любит Юру. Определите предпочтения юношей и девушек.

4) Три подруги вышли в белом, зеленом и синем платьях и туфлях. Известно, что только у Ани цвета платья и туфлей совпадали. Ни туфли, ни платье Вали не были белыми. Наташа была в зеленых туфлях. Определить цвета платья и туфель на каждой из подруг.

 

Вариант 9.

1) В бутылке, стакане, кувшине и банке находятся молоко, лимонад, квас и вода. Известно, что вода и молоко не в бутылке, сосуд с лимонадом находится между кувшином и сосудом с квасом, в банке - не лимонад и не вода. Стакан находится около банки и сосуда с молоком. Как распределены эти жидкости по сосудам.

2. Джон, Дик и Роджер - цирковые клоуны. Во время отпуска они зарабатывают, как могут - каждый из них владеет двумя профессиями из шести: писатель, трубач, водитель грузовика, игрок в гольф, парикмахер, инженер. Сможете ли вы определить, кто какими профессиями владеет, если:

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

 

Вариант 10.

1) Три девочки Маша, Рита, Лена пошли гулять. На улице было жарко, и они купили мороженое «Белка», «Стрелка», «Гагара». Какое мороженое купила каждая из девочек, если Лена купила не «Белку» и не «Гагару», а Рита – не «Гагару».

2) Три сестры: Полли, Сара и Ада. Они приехали из деревни в большой город учиться. Одна сестра стала строителем, одна архитектором, а третья поваром. Позже все сестры вышли замуж. Одного мужа звали господин Адамсон, второго просто Педро, а третьего величали доктором Смитом. Ни у кого в семьях не совпали первые буквы профессии, имени мужа и жены. (Сара не стала строителем и ее муж не Смит). Жена Педро не строитель. Как зовут жену доктора?

 

 

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

 

1. На донорском пункте работали Джеймс, Генри и Томас. Один был вампиром, другой - оборотнем, третий - лишь маньяком.

Сыщик из Скотланд-Ярда расследуя дело, опросил всех троих. Вот что он услышал:

ДЖЕЙМС: "Генри - вампир"

ГЕНРИ: "Либо Джеймс, либо Томас - оборотень"

ТОМАС: "На самом деле вампир - Джеймс!"

Солгал только оборотень, а остальные говорили правду. Но полицию интересовал только маньяк, которого и арестовали.

Кого же арестовала полиция?

Решение.

 

2. В семье пять человек: муж, жена, их сын, сестра мужа и отец жены. Их профессии - инженер, юрист, слесарь, учитель и экономист. Известно, что юрист и учитель - не кровные родственники. Слесарь младше экономиста, и оба играют в футбол за сборную своего завода. Инженер моложе учителя, но старше жены своего брата. Назовите профессии каждого.

Решение. Опишем предикаты для названий родственников и их профессий в виде фактов.

 

Далее, начинаем составлять соответствие, пусть переменные вида означают профессии, а  - родственников. Одну из этих категорий можно задать в виде констант – присвоить им значения. Поскольку в задаче говорится об отношениях людей с определенными профессиями, то профессии и зададим как константы. На этом этапе можно убрать факты prof, они нам не понадобятся. Введены факты prof были для того, чтобы показать, с чего надо начинать решать подобные задачи. Впрочем, наличие этих фактов нам никак не помешает. Итак, начинаем писать основной предикат:

 

sootv(X1,Y1,X2,Y2,X3,Y3,X4,Y4,X5,Y5):-X1="engineer",X2="lawyer",X3="locksmith",X4="teacher",X5="economist", 

 

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

sootv(X1,Y1,X2,Y2,X3,Y3,X4,Y4,X5,Y5):- X1="engineer",X2="lawyer",X3="locksmith",X4="teacher",X5="economist",                              men(Y1),men(Y2),men(Y3),men(Y4),men(Y5),Y1<>Y2,Y1<>Y3,Y1<>Y4, Y1<>Y5,Y2<>Y3,Y2<>Y4,Y2<>Y5,Y3<>Y4,

Y3<>Y5,Y4<>Y5,

Если запустить программу на этом этапе, у нас будет 120 вариантов решения, так как мы еще не указали дополнительных условий. Начинаем внимательно читать условия задачи: «Известно, что юрист и учитель - не кровные родственники». Добавим новый предикат для кровных родственников – relative. Очевидно, кровными родственниками будут являться пары муж-сын, жена-сын, муж-сестра и жена-отец.

Юрист у нас является родственником по имени Y2, а учитель – Y4. Добавляем в предикат sootv условия

 not(relative(Y2,Y4)), not(relative(Y4,Y2)),

Заметьте, что добавить надо именно два условия, либо обойтись , например, одним первым условием, но тогда придется в предикате relative добавить строку вида

relative(X,Y):-relative(Y,X).

для учета всех пар кровных родственников.

Далее идет достаточно сложное условие «слесарь младше экономиста», сложность состоит в том, что мы не можем быть уверены насчет соотношения возрастов персонажей. Скажем, младше ли жена сестры, сын сестры, муж отца жены или  наоборот? Тут лучше ввести новый предикат, означающий «старше» и задать в нем пары, относительно которых есть точная уверенность, а именно : муж и жена старше сына, отец жены старше сына – своего внука, отец старше жены.   

Добавляем в sootv условие, что слесарь не старше экономиста

not(older(Y3,Y5))

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

Добавляем в sootv условия

male(Y3),male(Y5)

Аналогично, учтем, что инженер не старше учителя

not(older(Y4,Y1)) .

Далее сказано, что инженер старше жены своего брата ,но ведь только у одного персонажа в семье есть брат – у сестры мужа! Значит, можно смело написать

Y1="sister"

Осталось учесть последнее условие, что инженер старше жены – тут можно указать, что в этом случае жена не учитель (иначе инженер получится и младше учителя-жены и одновременно старше):

Y4<>"wife".

Окончательно, предикат sootv и цель будут выглядеть так:

 

После запуска получаем единственный ответ:

 

 

Лабораторная работа № 8.

 

Создание экспертной системы на Прологе.

Изучить приведенный текст (автор П.Шрайнер http://www.intuit.ru/studies/courses/44/44/lecture/1334?page=2). Написать собственную экспертную систему по примеру приведенной ниже. По возможности добавить механизм вывода. По возможности создать исполняемое приложение.

Теперь рассмотрим еще один пример применения Пролога в области искусственного интеллекта. Создадим небольшуюэкспертную систему. Экспертными системами обычно называют программы, которые могут заменить эксперта в какой-то предметной области. Мы построим классификационную экспертную систему, которая будет пытаться угадать загаданное человеком животное. Если загаданное человеком животное окажется неизвестно нашей программе, у нее будет возможность пополнить свою базу знаний новой информацией.

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

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

Определим два предиката внутренней базы данных, которые позволят нам хранить информацию о животных.

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

Небольшой базовый набор свойств может выглядеть, например, так:

cond(1,"кормит детенышей молоком").cond(2,"имеет перья").cond(3,"плавает").cond(4,"ест мясо").cond(5,"имеет копыта").cond(6,"летает").cond(7,"откладывает яйца").cond(8,"имеет шерсть").cond(9,"имеет полосы").cond(10,"имеет пятна").cond(11,"имеет черно-белую окраску").cond(12,"имеет длинную шею").cond(13,"имеет длинные ноги").cond(14,"имеет щупальца").

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

Выглядеть эта база знаний может примерно следующим образом:

rule("гепард",[1,4,8,10]).rule("тигр",[1,4,8,9]).rule("жираф",[1,5,8,10,12,13]).rule("зебра",[1,5,8,9,11]).rule("страус",[2,14]).rule("пингвин",[2,3,11]).rule("орел",[2,6]).rule("кит",[1,3,11]).rule("осьминог",[3,14]).

По сути дела, в виде фактов записаны правила. Например, правило: "если животное кормит детенышей молоком, имеет копыта, пятна, длинную шею и ноги, то это жираф", записано в виде rule("жираф", [1,5,11,13,14]).

Во второй базе мы будем хранить ответы человека в следующем виде:

cond_is(N,'1') /* если загаданное животное имеет свойство          с номером N */cond_is(N,'2') /* если загаданное животное не имеет          свойства с номером N */

Первую базу назовем knowledge, а вторую — dialog.

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

Вот как будет выглядеть реализация написанного выше.

animals:–   rule(X,L),   check(L),   nl,write("Я думаю это ",X),   nl,write("Я прав? (1 — да, 2 — нет)"),   read_true_char(C),C='1',!.animals:–   nl,write("Я не знаю, что это за животное"),nl,         nl,write("Давайте добавим его в мою базу         знаний."),nl,   update.

Предикат check осуществляет проверку свойств, номера которых входят в список, указанный в качестве его единственного аргумента.

check([H|T]):–        test_cond(H),              check(T).check([]).

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

Вот как это можно записать.

test_cond(H):–        cond_is(H,'1'),!. /* в базе имеется             информация о наличии             данного свойства */test_cond(H):–        cond_is(H,'2'),!,        fail. /* в базе имеется информация            об отсутствии  данного свойства */test_cond(H):– /* в базе нет никакой информации о данном        свойстве, получаем ее у человека */        cond(H,S),        nl,write("Оно ",S,"? (1 — да, 2 — нет)"),        read_true_char(A),        assert(cond_is(H,A)),        test_cond(H).

Предикат read_true_char осуществляет проверку нажатой пользователем клавиши, и если она отлична от '1' или '2', выводит соответствующее сообщение и повторно считывает символ с клавиатуры.

read_true_char(C):–  readchar(C1),  test(C1,C).test(C,C):–     '1'<=C,C<='2',!.test(_,C):–     write("Нажмите 1 или 2!"),nl,     readchar(C1),     test(C1,C).

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

Вот как он будет выглядеть:

update:–  nl,write("Введите название животного:"),  readln(S),  add_cond(L), /* указываем свойства животного */  assert(rule(S,L),knowledge),          /* добавляем информацию в базу             знаний*/  save("animals.ddb",knowledge)          /* сохраняем базу знаний в файл */.

Предикат add_cond с помощью предиката print_cond выводит уже имеющуюся в базе информацию о свойствах загаданного животного и спрашивает, известно ли еще что-нибудь о нем. В случае необходимости добавляет его новые характеристики, используя предикат read_cond.

add_cond(L):–        cond_is(_,'1'),!,              /* имеется информация о свойствах                 животного */        nl,write("О нем известно, что оно: "),        print_cond(1,[],L1),              /* вывод имеющейся информации                 о животном */        nl,write("Известно ли о нем еще что-нибудь?        (1 — да, 2 — нет)"),        read_true_char(C),        read_cond(C,L1,L).add_cond(L):–        read_cond('1',[],L).

Предикат read_cond, используя предикат ex_cond, добавляет в список номера свойств, уже имеющихся в базе; используяпредикат new_cond, добавляет в список номера новых свойств, а также описания самих свойств — в базу знаний.

read_cond('1',L,L2):–     ex_cond(1,L,L1,N),     new_cond(N,L1,L2),!. read_cond(_,L,L):–!.

Основные предикаты мы рассмотрели, а вот как будет выглядеть вся программа целиком:

DOMAINSi=integers=stringc=charli=i* /* список целых чисел */DATABASE — knowledgecond(i,s) /* свойства животных */rule(s,li) /* описания животных */DATABASE — dialogcond_is(i,c) /* номер условия; '1' — имеет место,      '2' — не имеет места у загаданного      животного */PREDICATESstartanimals /* отгадывает животное */check(li) /* добавляет в базу информацию о новом              животном */test_cond(i) /* проверяет, обладает ли загаданное      животное свойством с данным номером */update /* добавляет в базу информацию о новом животном */add_cond(li) /* возвращает список, состоящий из номеров             свойств, имеющихся у нового животного */print_cond(i,li,li) /* добавляет в список номера свойств,             относительно которых уже были даны             утвердительные ответы */read_cond(c,li,li) /* добавляет в список номера свойств,            о которых еще не спрашивалось */ex_cond(i,li,li,i) /* добавляет в список номера имеющихся            в базе свойств, которыми обладает            новое животное */wr_cond(c,i,li,li)new_cond(i,li,li) /* добавляет в список номера новых           свойств, которыми обладает новое           животное, а также добавляет описания           новых свойств в базу знаний */read_true_char(c) /* с помощью предиката test читает           символ с клавиатуры, пока он           не окажется равен '1' или '2'*/test(c,c) /* добивается, чтобы пользователь нажал один              из символов, '1' или '2' */CLAUSESstart:–  consult("animals.ddb",knowledge),               /* загружаем в базу информацию                   из базы знаний */  write("Загадайте животное, а я попытаюсь его        отгадать"),nl,  animals, /* попытка отгадать загаданное животное */     retractall(_,dialog), /* очищаем текущую           информацию */  retractall(_,knowledge),                   /* очищаем информацию об известных           животных и свойствах */  nl,nl,write("Хотите еще раз сыграть? (1 — Да,        2 — Нет)"),  read_true_char(C),  C='1',!,start. start:–  nl,nl,write("Всего доброго! До новых встреч"),  readchar(_).animals:–   rule(X,L),   check(L),   nl,write("Я думаю, это ",X),   nl,write("Я прав? (1 — да, 2 — нет)"),   read_true_char(C),C='1',!.animals:–   nl,write("Я не знаю, что это за животное"),nl,         nl,write("Давайте добавим его в мою базу знаний."),nl,   update.update:–   nl,write("Введите название животного:"),     readln(S),   add_cond(L), /* указываем свойства животного */   assert(rule(S,L),knowledge), /* добавляем информацию                   в базу знаний*/   save("animals.ddb",knowledge) /* сохраняем базу                    знаний в файл */.add_cond(L):–        cond_is(_,'1'),!, /* имеется информация             о свойствах животного */        nl,write("О нем известно, что оно: "),        print_cond(1,[],L1),          /* вывод имеющейся о животном             информации */        nl,write("Известно ли о нем еще что-нибудь?              (1 — да, 2 — нет)"),        read_true_char(C),        read_cond(C,L1,L).add_cond(L):–        read_cond('1',[],L).print_cond(H,L,L):–   not(cond(H,_)),!.print_cond(H,L,L1):–    cond_is(H,'1'),!,    cond(H,T),    H1=H+1,    nl,write(T),    print_cond(H1,[H L],L1).print_cond(H,L,L1):–    H1=H+1,    print_cond(H1,L,L1).read_cond('1',L,L2):–     ex_cond(1,L,L1,N),     new_cond(N,L1,L2),!. read_cond(_,L,L):–!.ex_cond(N,L,L,N):–  not(cond(N,_)),!.ex_cond(N,L,L1,N2):–    cond_is(N,_),!,    N1=N+1,    ex_cond(N1,L,L1,N2).ex_cond(N,L,L1,N2):–    cond(N,S),    nl,write("Оно ",S,"? (1 — да, 2 — нет)"),    read_true_char(A),    wr_cond(A,N,L,L2),    N1=N+1,    ex_cond(N1,L2,L1,N2).wr_cond('1',N,L,[N L]):–!.wr_cond('2',_,L,L):–!.new_cond(N,L,L1):–  nl,write("Есть еще свойства? (1 — да,        2– нет)"),  read_true_char(A),  A='1',!,  nl,write("Укажите новое свойство,        которым обладает животное"),  nl,write("в виде 'оно <описание        нового свойства>'"), readln(S),  assertz(cond(N,S)),                  /* добавление нового свойства          в базу знаний */  N1=N+1,  new_cond(N1,[N L],L1).new_cond(_,L,L).check([HT]):–         test_cond(H),               check(T).check([]).test_cond(H):-         cond_is(H,'1'),!. /* в базе имеется информация              о наличии свойства */test_cond(H):–         cond_is(H,'2'),!,         fail. /* в базе имеется информация            об отсутствии свойства */test_cond(H):– /* в базе нет никакой информации о данном        свойстве, получаем ее у человека */         cond(H,S),         nl,write("Оно ",S,"? (1 — да, 2 — нет)"),         read_true_char(A),         assert(cond_is(H,A)),         test_cond(H).read_true_char(C):–   readchar(C1),     test(C1,C).test(C,C):–      '1'<=C,C<='2',!.test(_,C):–      write("Нажмите 1 или 2!"),nl,      readchar(C1),      test(C1,C). GOALstart

 


Дата добавления: 2019-03-09; просмотров: 1325; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!