Поиск:

Ответ в темуСоздание новой темы Создание опроса
> База знаний в SWI Prolog, Какой оператор использовать 
:(
    Опции темы
NovichecheK
Дата 17.10.2014, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 17.10.2014

Репутация: нет
Всего: нет



Здравствуйте. Я начинающий учитель. Дошли до темы Экспертные системы. Изучаем SWI Пролог. Нашла подходящую задачу на Турбо Прологе. Но в ней есть правило, которое я не могу переделать под SWI. Проверяет наличие признака:
priznak(Z) :-
yes(Z),!.
priznak(Z):-
    not( no(Z)),
    question(Z).
Нашла, что в Турбо есть positive, negative. А как реализовать в SWI? Есть ли аналоги?
Помогите, подскажите. 
PM MAIL   Вверх
Фантом
Дата 17.10.2014, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 6
Всего: 49



Про Turbo Prolog все как-то давно забыли, поэтому напишите, что каждый из недостающих предикатов делает. По названиям это не так уж очевидно.
PM   Вверх
NovichecheK
Дата 17.10.2014, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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.
Это я процитировала автора. 
PM MAIL   Вверх
Фантом
Дата 17.10.2014, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 6
Всего: 49



Что-то я не понял проблемы. Просто уберите то, что было разделом "global facts", и все.
PM   Вверх
NovichecheK
Дата 18.10.2014, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 ?-
Проблем с логикой программы нет, синтаксических ошибок тоже нет. 
PM MAIL   Вверх
Фантом
Дата 18.10.2014, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 6
Всего: 49



Выложите-ка сюда код вместе с примером запроса. По описанию все должно быть в порядке.
PM   Вверх
NovichecheK
Дата 18.10.2014, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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.
И после этого начинается.... (((
PM MAIL   Вверх
Фантом
Дата 18.10.2014, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 6
Всего: 49



А, теперь ясно. Тут просто надо в начале программы написать
Код

:-dynamic
    yes/1,
    no/1.

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

Ну и, кстати, там придется еще кучу всего доопределять (readchar, save). 
PM   Вверх
NovichecheK
Дата 19.10.2014, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 17.10.2014

Репутация: нет
Всего: нет



Я так поняла, что это не самый лучший вариант написания экспертной системы (по крайней мере, под SWI). Не подскажите тогда, как лучше переделать. Просто учить надо на хороших примерах или не учить совсем.  У меня есть еще время разобраться и переделать, занятие через неделю. 
PM MAIL   Вверх
NovichecheK
Дата 19.10.2014, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 17.10.2014

Репутация: нет
Всего: нет



И еще. Доопределила правила
 :-dynamic
    yes/1,
    no/1,
    save/1,
    readchar/1,
    exit/0 .
Программа заработала, НО.. Выдает первый вопрос три раза и завершает работу(корректно). Но возможности ответить на вопрос нет (то есть нажать y или n). Включала трассировку (не все в ней поняла), но вроде проходит по всем правилам.  Может ли так быть, что в связи с тем, что я описывала как динамические предикаты/правила, и их значения не передаются из правила в правило (как бывает в подпрограммах на языках программирования). Если я не слишком обременяю, помогите разобраться. Вроде каждое правило по отдельности понятно и в целом все логично, но не работает как надо.
PM MAIL   Вверх
Фантом
Дата 19.10.2014, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 6
Всего: 49



Цитата(NovichecheK @  19.10.2014,  12:39 Найти цитируемый пост)
Я так поняла, что это не самый лучший вариант написания экспертной системы (по крайней мере, под SWI). Не подскажите тогда, как лучше переделать.
 Пожалуй, взять и написать заново, четко разделив факты и вопросы, которые задаются в случае неопределенного состояния. 

Цитата(NovichecheK @  19.10.2014,  14:48 Найти цитируемый пост)
И еще. Доопределила правила
 :-dynamic
    save/1,
    readchar/1,
    exit/0 .

Зачем?!

Цитата(NovichecheK @  19.10.2014,  14:48 Найти цитируемый пост)

Программа заработала, 
 Вернее, перестала выдавать ошибки выполнения. Это не одно и то же. В TP эти предикаты встроены и обеспечивают определенную функциональность, а тут их попросту нет, соответственно, их надо написать.

Цитата(NovichecheK @  19.10.2014,  12:39 Найти цитируемый пост)
Просто учить надо на хороших примерах или не учить совсем.  У меня есть еще время разобраться и переделать, занятие через неделю.  
 Простите за нетактичный вопрос, но... Вы сами Пролог знаете? Если нет или на уровне "пару раз видели", то лучше отложить это на потом. За неделю нормально разобраться не получится.

PM   Вверх
NovichecheK
Дата 20.10.2014, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 17.10.2014

Репутация: нет
Всего: нет



Это не моя прихоть-хочу учу, хочу нет. Есть рабочая программа, стандарт. К сожалению, так получается, что учу(сь) одновременно с учениками... Плюнула я на ЭТУ базу, вяла другую. Правда, все равно пришлось переделывать, но главное-РАБОТАЕТ. Спасибо за помощь. Берегите себя.
PM MAIL   Вверх
rrrFer
Дата 30.10.2014, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: нет
Всего: 1



NovichecheK
Чтобы нормально учить - прочитайте книжку какую-нибудь и вопросов сразу будет меньше.

Например эту: Сергиевский Г. М. Функциональное и логическое программирование : [учеб. пособие] / Г. М. Сергиевский, Н. Г. Волченков. – М. : Академия, 2010. – 317с
Или хотя бы эту: Хабаров С.П. Интеллектуальные информационные системы. Prolog — язык разработки интеллектуальных и экспертных систем: учебное пособие / С.П.Хабаров.- СПб. СПбГЛТУ, 2013.- 138 с.

В первой побольше матана, во второй - картинок. В обоих описывается в том числе и SWI (в первой больше, во второй - меньше)

Ну иначе это все срам какой-то. Я даже не представляю себе ваши занятия.

Это сообщение отредактировал(а) rrrFer - 30.10.2014, 12:00
PM MAIL WWW ICQ   Вверх
NovichecheK
Дата 2.11.2014, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 17.10.2014

Репутация: нет
Всего: нет



rrrFer, не мучьте себя - не представляйте себе мои занятия. ;)
PM MAIL   Вверх
rrrFer
Дата 15.11.2014, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: нет
Всего: 1



Цитата

rrrFer, не мучьте себя - не представляйте себе мои занятия. ;) 


Короче, суть в том, что я хочу чтобы в этой стране ВУЗы приносили пользу. Ну и не только ВУЗы, но и всякие другие заведения, в том числе витуальные (типа вот этого форума).

Ты можешь оставить студентов, которым интересен курс и прочитать им его нормально. В результате хотя бы часть студентов ПОЛУЧИТ ШАНС нормально трудоустроиться после защиты диплома. Проводя занятия хреново ты лишь мешаешь студентам (ведь они тратят время на твои занятия). Может стоит уволиться?

Спрашиваю лишь потому, что вот у меня в ВУЗе программирование вели 2 женщины, которые даже в методичках сделали невиданное количество ошибок, ничего сложнее хеловорлда в жизне не писали.  ООП вел администратор (он учился у студентов примерно как и ты). Ну и другие чудаки были, один агитировал за сепаратизм, например.

Суть в том, что студент тратит на ВУЗ кучу времени, а получает хрен. Я считаю, что самый полезный предмет в вузе у меня был физкультурой, все остальное можно было вообще не посещать.

На хабре есть статьи, где руководители отделов Яндекса пишут примерно тоже самое - у 99% руководителей в яндексе нет профильного образования. И я думаю, что именно поэтому они рулят в яндексе - пока твои студенты учат тебя прологу - эти ребята занимаются самообразованием и получением опыта. Тебе самой не жаль студентов? - ты понимаешь что они тратят время зря? Если ты не в состояниии их ничему научить - проставь автоматы и отпусти. (а лучше уволься, т.к. зарплату ты получаешь зря, возможно)

К слову, вроде как в Яндексе есть отдел пролог-программистов (одна барышня рассказывала как пыталась туда трудоустроиться). Т.е. твой предмет может реально помочь кому-то найти хорошую работу, а ты...

Если че, обидеть не хотел, но меня дико бесят некомпетентные люди, особенно если они пытаются учить.

Это сообщение отредактировал(а) rrrFer - 15.11.2014, 21:46
PM MAIL WWW ICQ   Вверх
Google
  Дата 22.5.2019, 06:36 (ссылка)  





  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Prolog | Следующая тема »


 




[ Время генерации скрипта: 0.1284 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.