На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Экспертная система (Turbo Prolog)
    Есть программа экспертной системы по подборе сотового телефона. Все работает нормально, только нужно добавить одну вещь... Нужно чтобы после того как система выдала нам один вариант телефона, она задавала следующий вопрос: "Выберите следующий вариант из списка." и вылетает список из трех элементов: 1. Показать телефон подешевле. 2. Показать телефон подороже. 3. Данная модель меня устраивает. Нужно сделать проверку по стоимости и при нажатии 1 или 2 выдавал другую модель телефона с такими же параметрами. Ну а при нажатии 3 просто завершала работу.
    Вот код программы:
    ExpandedWrap disabled
      database
        yes(string)
        no(string)
        maybe(string)
       
      predicates
        repeat
        run
        tel(string,integer)
        is(string)
        positive(string)
        negative(string)
        xpositive(string)
        xnegative(string)
        ask(string,char)
        remember(string,char)
        delete_all
      clauses
        repeat.
        repeat:-repeat.
      %-----------------------------------------------------------------------------
      % описываем технические характеристики сотового телефона
        tel("Nokia 1202", 1000):- positive("цветной дисплей"),positive("емкий аккумулятор"),
                           negative("имеет камеру"),
                           negative("имеет FM-радио"),
                 negative("имеет Mp3-плеер"),
                 is("только для связи").
       
        tel("Nokia 1208", 1190):-positive("цветной дисплей"),positive("емкий аккумулятор"),
                 negative("имеет камеру"),
                           negative("имеет FM-радио"),
                 negative("имеет Mp3-плеер"),
                 is("только для связи").
       
        tel("Samsung E1070", 890):- positive("цветной дисплей"),positive("емкий аккумулятор"),
                 negative("имеет камеру"),
                           negative("имеет FM-радио"),
                 negative("имеет Mp3-плеер"),
                 is("только для связи").
       
        tel("Nokia 2630", 2490):-positive("цветной дисплей"),positive("емкий аккумулятор"),
                negative ("имеет камеру"),
                           positive ("имеет FM-радио"),
                 negative("имеет Mp3-плеер"),
                 is("только для связи"), is("развлечения и музыка").
       
        tel("LG KP105", 1490):- positive("цветной дисплей"),positive("емкий аккумулятор"),
                 negative ("имеет камеру"),
                           positive ("имеет FM-радио"),
                 negative("имеет Mp3-плеер"),
                 is("только для связи").
       
        tel("LG GB110", 2550):- positive("цветной дисплей"),positive("емкий аккумулятор"),
                 negative ("имеет камеру"),
                           positive ("имеет FM-радио"),
                negative ("имеет Mp3-плеер"),
                 is("только для связи"), is("развлечения и музыка").
       
       
        tel("Nokia E52", 12990):- positive("цветной дисплей"), positive ("емкий аккумулятор"),
                 positive ("имеет камеру"),
                           positive ("имеет FM-радио"),
                 positive ("имеет флэш-карту"),
                 negative("имеет навигацию"),
                 negative("имеет Mp3-плеер"),
                 is("мобильный офис").
       
        tel("Nokia E66", 11890):- positive("цветной дисплей"), positive ("емкий аккумулятор"),
                 positive ("имеет камеру"),
                           positive ("имеет FM-радио"),
                 positive ("имеет флэш-карту"),
                 negative ("имеет навигацию"),
                 negative("имеет Mp3-плеер"),
                 is("мобильный офис"),  is("помощник в путешествиях").
       
       
        tel("Nokia E63", 13500):- positive("цветной дисплей"), positive ("емкий аккумулятор"),
                 positive ("имеет камеру"),
                           positive ("имеет FM-радио"),
                 positive ("имеет флэш-карту"),
                 negative ("имеет навигацию"),
                 negative("имеет Mp3-плеер"),
                 is("мобильный офис"),  is("помощник в путешествиях").
       
        tel("Nokia 5310", 7990):- positive("цветной дисплей"), positive ("емкий аккумулятор"),
                 positive ("имеет камеру"),
                           positive ("имеет FM-радио"),
                 positive ("имеет флэш-карту"),
                 positive ("имеет Mp3-плеер"),
                 negative("сенсорный дисплей"),
                 positive ("имеет дополнительные клавиши управления Mp3-плеером"),
                 is("развлечения и музыка").
       
        tel("Nokia 5530", 7780):- positive("цветной дисплей"), positive ("емкий аккумулятор"),
                 positive ("имеет камеру"),
                           positive ("имеет FM-радио"),
                 positive ("имеет флэш-карту"),
                 positive ("имеет Mp3-плеер"),
                 negative ("сенсорный дисплей"),
                 positive ("имеет дополнительные клавиши управления Mp3-плеером"),
                 is("развлечения и музыка").
       
        tel("Nokia 5800", 8890):- positive("цветной дисплей"), positive ("емкий аккумулятор"),
                 positive ("имеет камеру"),
                           positive ("имеет FM-радио"),
                 positive ("имеет флэш-карту"),
                 positive ("имеет Mp3-плеер"),
                 negative ("сенсорный дисплей"),
                 positive ("имеет дополнительные клавиши управления Mp3-плеером"),
      is("развлечения и музыка"), is("мобильный офис"),is ("помощник в путешествиях").
       
        tel("SonyEricsson W595", 8450):- positive("цветной дисплей"), negative ("емкий аккумулятор"),
                 positive ("имеет камеру"),
                           positive ("имеет FM-радио"),
                 positive ("имеет флэш-карту"),
                 positive ("имеет Mp3-плеер"),
                 negative("сенсорный дисплей"),
                 negative ("имеет дополнительные клавиши управления Mp3-плеером"),
                 is("развлечения и музыка").
       
        tel("SonyEricsson W395", 7890):- positive("цветной дисплей"), negative ("емкий аккумулятор"),
                 positive ("имеет камеру"),
                           positive ("имеет FM-радио"),
                 positive ("имеет флэш-карту"),
                 positive ("имеет Mp3-плеер"),
                 negative("сенсорный дисплей"),
                 negative ("имеет дополнительные клавиши управления Mp3-плеером"),
                 is("развлечения и музыка").
       
        tel("Nokia N86", 24790):- positive("цветной дисплей"), positive ("емкий аккумулятор"),
                 positive ("имеет камеру"),
                           positive ("имеет FM-радио"),
                 positive ("имеет флэш-карту"),
                 positive ("имеет навигацию"),
                 positive ("имеет Mp3-плеер"),
                 negative ("имеет Wi-Fi"),
                 positive ("имеет дополнительную клавиатуру"),
                 is("помощник в путешествиях"), is("мобильный офис").
       
        tel("Nokia N97", 27990):- positive("цветной дисплей"), positive ("емкий аккумулятор"),
                 positive ("имеет камеру"),
                           positive ("имеет FM-радио"),
                 positive ("имеет флэш-карту"),
                 positive ("имеет навигацию"),
                 positive ("имеет Mp3-плеер"),
                 negative ("имеет Wi-Fi"),
                 positive ("имеет дополнительную клавиатуру"),
      is("помощник в путешествиях"), is("мобильный офис"), is("развлечения и музыка").
       
        tel("Такой телефон еще не произведен!!!!", 0).
       
      %-----------------------------------------------------------------------------
        is("только для связи"):-positive("звонить и отправлять смс"),!.
        is("мобильный офис"):- positive("смартфон"),!;
                               negative("слушать музыку"),
                               positive("звонить и отправлять смс").
        is("развлечения и музыка"):- positive("слушать музыку"),!;
                                     positive("звонить и отправлять смс"),
                                     negative("смартфон").
        is("помощник в путешествиях"):-positive("имеет GPS-навигацию").
      %-----------------------------------------------------------------------------
      % работа с динамической базой данных
        positive(X):-xpositive(X),!; xnegative(X),!,fail; ask(X,'y').
        negative(X):-xnegative(X),!; xpositive(X),!,fail; ask(X,'n').
        ask(X,R):-write(X,"  ?  : "),readchar(Reply),write(Reply,"\n"),
                  remember(X,Reply),R=Reply.
      % проверка присутствия фактов в динамической базе данных
        xpositive(X):-yes(X);maybe(X).
        xnegative(X):-no(X);maybe(X).
      % запоминаем факт в динамической базе данных
        remember(X,'y'):-asserta(yes(X)).
        remember(X,'n'):-assertz(no(X)).
        remember(X,'q'):-asserta(maybe(X)).
      % очищаем память от фактов динамической базы данных
      delete_all:-retract(yes(_)),delete_all.
      delete_all:-retract(no(_)),delete_all.
      delete_all:-retract(maybe(_)),delete_all.
      delete_all.
      %-----------------------------------------------------------------------------
        run:-delete_all,
             repeat,
             write("На вопросы отвечать (y-да, n-нет, q-не знаю).\n"),    
              
          make_selection(X, A, CHOOSE),
          continue_selection(CHOOSE, X, A),
             write("Завершить работу программы (y/n): "),readchar(Z),
             write(Z),nl,
             Z='y'.
       
      make_selection(X, A, CHOOSE) :- tel(X,A), write("Ваш выбор: ",X," цена: ",A,"\n"),
              write("Устраивает ли вас цена? \n1-да, данная модель меня устраивает\n2-нет, покажите модель по дешевле\n3-нет, покажите модель по дороже\n"),
              readchar(CHOOSE).
       
      continue_selection('1', X, A) :-  !, write("Ваш выбор: ",X," цена: ",A,"\n"), !.
      continue_selection('2', X, A) :-  !, tel(X, Z), Z < A, write("-->>", X, " - ", Z).
      continue_selection('3', X, A) :-  !, tel(X, Z), Z > A, write("-->>", X, " - ", Z).
       
      goal
        makewindow(1,10,12," Экспертная система : СОТОВЫЕ ТЕЛЕФОНЫ ",0,0,25,80),
        write("--------------------------------------------"),nl,
        run.

    Вопрос в том, почему при попытке поиска телефона стоимостью ниже/выше, программа выходит на начало поиска, а не остается в предекате выбора меньшей/высшей цены? Может кто-нибудь подсказать реализацию выбора телефона с меньшей или высшей ценой?
    ExpandedWrap disabled
      continue_selection('2', X, A) :-  !, tel(X, Z), Z < A, write("-->>", X, " - ", Z).
      continue_selection('3', X, A) :-  !, tel(X, Z), Z > A, write("-->>", X, " - ", Z).
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0236 ]   [ 15 queries used ]   [ Generated: 2.05.24, 19:31 GMT ]