|
|
|
NovichecheK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 17.10.2014 Репутация: нет Всего: нет |
Здравствуйте. Я начинающий учитель. Дошли до темы Экспертные системы. Изучаем SWI Пролог. Нашла подходящую задачу на Турбо Прологе. Но в ней есть правило, которое я не могу переделать под SWI. Проверяет наличие признака:
priznak(Z) :- yes(Z),!. priznak(Z):- not( no(Z)), question(Z). Нашла, что в Турбо есть positive, negative. А как реализовать в SWI? Есть ли аналоги? Помогите, подскажите. |
|||
|
||||
Фантом |
|
|||
Вы это прекратите! Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 6 Всего: 49 |
Про Turbo Prolog все как-то давно забыли, поэтому напишите, что каждый из недостающих предикатов делает. По названиям это не так уж очевидно.
|
|||
|
||||
NovichecheK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 17.10.2014 Репутация: нет Всего: нет |
Спасибо за отклик. Не умею прикреплять файлы, поэтому скопирую из разработки.
"Построим небольшую экспертную систему, которая будет определять одну из нескольких рыб по признакам, указанным пользователем. Система будет задавать вопросы и строить логические выводы на основе полученных ответов. Базу знаний будут составлять следующие правила: fish("это сазан"):- otrajd("отряд карпообразные"), priznak("губы с 4 усиками"). fish("это плотва"):- otrajd("отряд карпообразные"), priznak("плавники с розовыми перьями"). fish("это лещ"):- otrajd("отряд карпообразные"), priznak("у рыбы желто-золотистый окрас"), priznak("у рыбы спинной плавник узкий"). И так далее...Есть еще правила из базы знаний. Потом автор предлагает Для хранения информации, полученной от пользователя, используются предикаты yes и no, составляющие внутреннюю базу фактов. Предикат yes служит для хранения фактов, соответствующих положительному ответу, а предикат no – для хранения отрицательных ответов. Т.е. предикат yes утверждает наличие какого-либо признака у рыбы, а no – отсутствие указанного признака. Эти предикаты объявляются в разделе внутренней базы фактов: global facts yes (symbol) no (symbol) (тут у меня загвоздка - в SWI нет этого раздела, и программа не понимает оператор). Добавить новые факты во внутреннюю базу можно с помощью правила add_to_database, состоящего из двух частей. Первая часть добавляет факты, соответствующие положительному ответу (с клавиатуры вводится ‘y’). Вторая часть правила добавляет факты, указывающие на отсутствие данного признака у рыбы. add_to_database (Y,'y') :- assertz (yes (Y)). add_to_database (Y,'n') :- assertz (no (Y)),fail. Необходимо предусмотреть очистку внутренней базы фактов. Для этого создадим правило: clear_from_database :- retract(yes(_)),fail. clear_from_database :- retract(no(_)),fail. Для проверки наличия у рыбы определенного признака создадим правило priznak (Y): priznak (Y) :- yes (Y),!. priznak (Y) :- not(no (Y)), question (Y). Формулировка вопроса, ввод ответа и сохранение соответствующего правила осуществляется с помощью правил: answer :- fish(X),!,nl, save("BF1.dbf"), write (" Ответ: ",X,"."),nl. question(Y) :- write ("Вoпрос: ",Y,"?(y/n) "), otvet(X), write(X),nl, add_to_database (Y,X). otvet©:-readchar©. И, наконец, правило begin, запускающее сеанс консультации: begin :- write ("Ответьте на вопросы :"),nl,nl, answer, clear_from_database, nl,nl,nl,nl, exit. Это я процитировала автора. |
|||
|
||||
Фантом |
|
|||
Вы это прекратите! Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 6 Всего: 49 |
Что-то я не понял проблемы. Просто уберите то, что было разделом "global facts", и все.
|
|||
|
||||
NovichecheK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 17.10.2014 Репутация: нет Всего: нет |
К сожалению, так просто не работает. Говорит, что Undefined procedure: yes/1. Вместо сообщения "Вопрос :рыба плавает в реках или озерах'? Выводится сообщение Exception: (12) yes('рыба плавает в реках или озерах') ? После ответа "y" Выводится Unknown option (h for help). А после ответа "n" - прерывается работа.
То есть так: 1 ?- begin. Ответьте на вопросы : ERROR: priznak/1: Undefined procedure: yes/1 Exception: (12) yes('рыба плавает в реках или озерах') ? Unknown option (h for help) Exception: (12) yes('рыба плавает в реках или озерах') ? no debug 2 ?- Проблем с логикой программы нет, синтаксических ошибок тоже нет. |
|||
|
||||
Фантом |
|
|||
Вы это прекратите! Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 6 Всего: 49 |
Выложите-ка сюда код вместе с примером запроса. По описанию все должно быть в порядке.
|
|||
|
||||
NovichecheK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 17.10.2014 Репутация: нет Всего: нет |
Программа:
fish('это сазан'):- otrajd('отряд карпообразные'), priznak('губы с 4 усиками'). fish('это плотва'):- otrajd('отряд карпообразные'), priznak('плавники с розовыми перьями'). fish('это лещ'):- otrajd('отряд карпообразные'), priznak('у рыбы желто-золотистый окрас'), priznak('у рыбы спинной плавник узкий'). fish('Данной рыбы в базе знаний не обнаружено'). otrajd('отряд карпообразные'):- vid('пресноводная рыба'), vid('костная рыба'), priznak('одиночный спинной лучевой плавник'), priznak('у рыбы нет зубов'). vid('костная рыба'):- priznak('у рыбы есть жаберные крышки'); priznak('у рыбы есть костный скелет'). vid('пресноводная рыба'):- priznak('рыба плавает в реках или озерах'). begin :- write('Ответьте на вопросы :'),nl, answer, clear_from_database, nl,nl,nl,nl, exit. answer :- fish(X),!,nl, save('BF1.dbf'), write(' Ответ: ',X,'.'),nl. question(Y) :- write(Y), otvet(X), write(X),nl, add_to_database(Y,X). otvet©:- readchar©. priznak(Y) :- yes(Y),!. priznak(Y) :- not( no(Y)), question(Y). add_to_database(Y,'y') :- assertz(yes(Y)). add_to_database(Y,'n') :- assertz(no(Y)),fail. clear_from_database :- retract(yes(_)),fail. clear_from_database :- retract(no(_)),fail. Запрос: begin. И после этого начинается.... ((( |
|||
|
||||
Фантом |
|
|||
Вы это прекратите! Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 6 Всего: 49 |
А, теперь ясно. Тут просто надо в начале программы написать
Код какой-то совершенно безумный, в итоге понять, что это база данных, транслятор просто не может. Ну и, кстати, там придется еще кучу всего доопределять (readchar, save). |
|||
|
||||
NovichecheK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 17.10.2014 Репутация: нет Всего: нет |
Я так поняла, что это не самый лучший вариант написания экспертной системы (по крайней мере, под SWI). Не подскажите тогда, как лучше переделать. Просто учить надо на хороших примерах или не учить совсем. У меня есть еще время разобраться и переделать, занятие через неделю.
|
|||
|
||||
NovichecheK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 17.10.2014 Репутация: нет Всего: нет |
И еще. Доопределила правила
:-dynamic yes/1, no/1, save/1, readchar/1, exit/0 . Программа заработала, НО.. Выдает первый вопрос три раза и завершает работу(корректно). Но возможности ответить на вопрос нет (то есть нажать y или n). Включала трассировку (не все в ней поняла), но вроде проходит по всем правилам. Может ли так быть, что в связи с тем, что я описывала как динамические предикаты/правила, и их значения не передаются из правила в правило (как бывает в подпрограммах на языках программирования). Если я не слишком обременяю, помогите разобраться. Вроде каждое правило по отдельности понятно и в целом все логично, но не работает как надо. |
|||
|
||||
Фантом |
|
||||||
Вы это прекратите! Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 6 Всего: 49 |
Зачем?! Вернее, перестала выдавать ошибки выполнения. Это не одно и то же. В TP эти предикаты встроены и обеспечивают определенную функциональность, а тут их попросту нет, соответственно, их надо написать.
|
||||||
|
|||||||
NovichecheK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 17.10.2014 Репутация: нет Всего: нет |
Это не моя прихоть-хочу учу, хочу нет. Есть рабочая программа, стандарт. К сожалению, так получается, что учу(сь) одновременно с учениками... Плюнула я на ЭТУ базу, вяла другую. Правда, все равно пришлось переделывать, но главное-РАБОТАЕТ. Спасибо за помощь. Берегите себя.
|
|||
|
||||
rrrFer |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: нет Всего: 1 |
NovichecheK
Чтобы нормально учить - прочитайте книжку какую-нибудь и вопросов сразу будет меньше. Например эту: Сергиевский Г. М. Функциональное и логическое программирование : [учеб. пособие] / Г. М. Сергиевский, Н. Г. Волченков. – М. : Академия, 2010. – 317с Или хотя бы эту: Хабаров С.П. Интеллектуальные информационные системы. Prolog — язык разработки интеллектуальных и экспертных систем: учебное пособие / С.П.Хабаров.- СПб. СПбГЛТУ, 2013.- 138 с. В первой побольше матана, во второй - картинок. В обоих описывается в том числе и SWI (в первой больше, во второй - меньше) Ну иначе это все срам какой-то. Я даже не представляю себе ваши занятия. Это сообщение отредактировал(а) rrrFer - 30.10.2014, 12:00 |
|||
|
||||
NovichecheK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 17.10.2014 Репутация: нет Всего: нет |
rrrFer, не мучьте себя - не представляйте себе мои занятия. ;)
|
|||
|
||||
rrrFer |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: нет Всего: 1 |
Короче, суть в том, что я хочу чтобы в этой стране ВУЗы приносили пользу. Ну и не только ВУЗы, но и всякие другие заведения, в том числе витуальные (типа вот этого форума). Ты можешь оставить студентов, которым интересен курс и прочитать им его нормально. В результате хотя бы часть студентов ПОЛУЧИТ ШАНС нормально трудоустроиться после защиты диплома. Проводя занятия хреново ты лишь мешаешь студентам (ведь они тратят время на твои занятия). Может стоит уволиться? Спрашиваю лишь потому, что вот у меня в ВУЗе программирование вели 2 женщины, которые даже в методичках сделали невиданное количество ошибок, ничего сложнее хеловорлда в жизне не писали. ООП вел администратор (он учился у студентов примерно как и ты). Ну и другие чудаки были, один агитировал за сепаратизм, например. Суть в том, что студент тратит на ВУЗ кучу времени, а получает хрен. Я считаю, что самый полезный предмет в вузе у меня был физкультурой, все остальное можно было вообще не посещать. На хабре есть статьи, где руководители отделов Яндекса пишут примерно тоже самое - у 99% руководителей в яндексе нет профильного образования. И я думаю, что именно поэтому они рулят в яндексе - пока твои студенты учат тебя прологу - эти ребята занимаются самообразованием и получением опыта. Тебе самой не жаль студентов? - ты понимаешь что они тратят время зря? Если ты не в состояниии их ничему научить - проставь автоматы и отпусти. (а лучше уволься, т.к. зарплату ты получаешь зря, возможно) К слову, вроде как в Яндексе есть отдел пролог-программистов (одна барышня рассказывала как пыталась туда трудоустроиться). Т.е. твой предмет может реально помочь кому-то найти хорошую работу, а ты... Если че, обидеть не хотел, но меня дико бесят некомпетентные люди, особенно если они пытаются учить. Это сообщение отредактировал(а) rrrFer - 15.11.2014, 21:46 |
|||
|
||||
Правила форума Prolog | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Prolog | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |