|
|
|
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 |
|||
|
||||
tzirechnoy |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: нет Всего: 16 |
rrrFer, а почему Вы решыли, что прочтение этих книжэк что-нибудь даст студентам или преподавателю сверх того, что у них есть?
То есть вот я нашёл из этих двух товарища Хабарова -- и что могу сказать -- стандартная методичка, сделанная "на отвали" коллективом из менеджэров и авторов, у некоторых из которых есть определённое понимание пролога, но нет понимания зачем вообще писать что-то в этой книжке, а у других -- понимание, зачем он пишэт эту отписку, но тотальное непонимание всего остального. В общем, уверен, ничуть не лучшэ любой другой Рекомендованной Методички (тм). И смысл это советовать? Получается ровно та жэ тренировка аппарата абстрактного мышления: студентам выдвигают какой-то набор синтаксически корректных определений, и требуют по аналогии произнести какие-то песни с обязательным формальным соблюдением этих требований. Не то, чтобы обязательно это очень плохо, только имеет очень мало отношэния к программированию, прологу и прочей инжэнерной деятельности. |
|||
|
||||
NovichecheK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 17.10.2014 Репутация: нет Всего: нет |
Я дико извиняюсь, что вмешиваюсь:)). 1) Тема не актуальна , т.к. как я написала 20.10.2014 - я разобралась, нашла ошибку и ЭС заработала. Занятие давно провела. 2) Методички, о которых дискутируют, прочла еще ДО рекомендации rrrFer из прочесть. И совершенно согласна с tzirechnoy - слабоваты. 3) rrrFer, я учусь не у студентов, а одновременно с ними. Это большая разница. Я НЕ считаю себя плохим преподавателем - иначе я не была бы здесь.
|
|||
|
||||
tzirechnoy |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: нет Всего: 16 |
Ошыбаетесь. Вопросы обучения, возможностей обучающихся и прочей педагогики -- сейчас вполне актуальны, независимо от того, прошли лично Вы ужэ этот этап или нет. |
|||
|
||||
rrrFer |
|
||||||||
Бывалый Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: нет Всего: 1 |
Потому что я посмотрел не только эту тему автора, но и сосдение темы (их несколько, например эта: http://forum.vingrad.ru/forum/topic-380305.html Странные вопросы задает преподаватель, тогда какие-же вопросы могут задавать студенты? Соотственно у меня большие сомнения по поводу этой фразы:
Вспомнил грубую пословицу - "смотрю в книгу, вижу фигу" (К ТС у меня никаких претензий и неприязни нет - просто вспомнил пословицу xD).
А какие другие рекомендованные методички? Литературы по ЛП - раз, два и обчелся. Есть книжки на интуите, но восновном большее УГ чем у хабарова. Хабаров хоть чуть-чуть пытается ответить на вопрос "зачем?", и рассматривает несколько диалектов пролога, в т.ч. современные SWI и Visual (свежих версий). Уже поэтому вот это не верно:
Не говоря уже, что другие рекомендованные методички написаны 99% в начаче90х гг и отстали даже от медленно развивающегося пролога. Там все др*чат на PDC Prolog. Ну и вопрос ребром, вы книжку Сергиевского читали или просто так размышляете? Какую книгу по прологу вы бы сами посоветовали? Я бы посоветовал разные книги (я это и сделал), например, потому что прологи бывают разные. И это не просто синтаксические различия или различия стандартных библиотек. Это сообщение отредактировал(а) rrrFer - 9.12.2014, 13:02 |
||||||||
|
|||||||||
cold95 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 7.10.2015 Репутация: нет Всего: нет |
Привет . Очень нужна помощь. Преподаватель задал написать программу на прологе ... я а в ном ничего не понимаю . вот задача: описать в базе знаний фрагмент файлового каталога. Привести информацию об имени , расширение и размер файла. Написать правило для ассоциации расширений файлов с программами, которые создали . Обеспечить поиск файла по его имени . Помогите кто может ... очень надо !!! Пожалуйста !!!! |
|||
|
||||
Правила форума Prolog | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Prolog | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |