Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Prolog > Реализация динамической базы


Автор: Vovanuch 21.12.2006, 17:25
Доброго времени суток.
Подскажите кто-нить, плз.  Надо создать базу, из которой берутся все вопросы (по порядку или в разброс) и в зависимости от ответа (y/n) выводить результат. 
Вот что написал:

:- dynamic   y/1, n/0.
%база знаний 
a(1,'Не исправен мотор').
a(2,'Не исправен руль').
a(3,'Нет колеса').
a(4,'Нет педалей').
a(5,'купите лошадь!').
a(6,'все в порядке!').
b(1,'не заводится машина').
b(2,'не могу повернуть при езде').
b(3,'машина стоит косо и не едет').
b(4,'не нажимаются педали').
b(5,'ничего не работает').

go:-
sprosit(X).

sprosit(X):-
b(X,Text),!,write('Верно ли утверждение: '),
write(Text),write('   '),nl,read(Z),otvet(X,Z).
otvet(M,Z):-Z='y',assert(y(M)).
otvet(M,Z):-Z='n',assert(n(M)).

Проблема в том, что  команда "go."выводит только 1ю запись и прекращает работу.
181 ?- go.
Верно ли утверждение: не заводится машина   
|    y.

Yes
182 ?- 

Как заставить выводить все вопросы? И как потом вывести комментарии к тем предложениям, на которые был получен ответ "y"?
Заранее спасибо.

Автор: FunnyFalcon 21.12.2006, 17:56
По-моему, зря отрезал (восклицательным знаком).

sprosit:-
b(X,Text),write('Верно ли утверждение: '),
write(Text),write('   '),nl,read(Z),otvet(X,Z).
otvet(M,'y'):-assert(y(M)).
otvet(M,'n'):-assert(n(M)).

Автор: Vovanuch 21.12.2006, 18:44
1) "sprosit:-"  -  на это он ругается, т.к. надо описывать с аргументами.    
sprosit(Х):-
  и т.д.
2) Зачем влепил воскл. знак - сам не знаю. Но  и без него не работает почему-то.

10 ?- go.
Верно ли утверждение: не заводится машина   
|: y.

Yes
11 ?- 

Это вот "Yes" говорит, что там еще есть что выводить, но почему он не идет на 2й просмотр икса? (Х=2)... ХЗ блин smile

Автор: Artemios 22.12.2006, 02:43
[
Цитата(Vovanuch @  21.12.2006,  18:44 Найти цитируемый пост)
на это он ругается, т.к. надо описывать с аргументами.

Что-то странное, на каком Прологе делаешь?
Я бы примерно так сделал:
Код

otvet(M,'y'):-assert(y(M)).
otvet(M,'n'):-assert(n(M)).

ay(A,B):- a(A,B),y(A).

sprosit:-
    b(X,Text),
    write('Верно ли утверждение: '),
    write(Text),write('   '),nl,
    read(Z),
    otvet(X,Z),
    write('Продолжить?'),
    read(Next),
    Next='y',!, sprosit;
    findall(Q,ay(N,Q),YList),
    write('Комментарии к положительным ответам: '), write(YList),nl.


Автор: Artemios 22.12.2006, 14:21
Цитата(Vovanuch @  21.12.2006,  18:44 Найти цитируемый пост)
"sprosit:-"  -  на это он ругается, т.к. надо описывать с аргументами. 

Цитата(Artemios @  22.12.2006,  02:43 Найти цитируемый пост)
Что-то странное, на каком Прологе делаешь?


Упс... Возможно, на твоем Прологе вместо "sprosit" нужно "sprosit()" использовать.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)