database
  yes(string)
  no(string)
  maybe(string)

predicates
  repeat
  run
  make_selection(string, integer, integer)
  continue_selection(integer, string, integer)
  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("Samsung E1070", 890):- positive("цветной дисплей"),positive("емкий аккумулятор"),
           negative("имеет камеру"),
                     negative("имеет FM-радио"),
           negative("имеет Mp3-плеер"),
           is("только для связи").
  
  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("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-нет, покажите модель по дороже"),
        readchar(CHOOSE).

continue_selection('1', X, A) :-  !, write("Ваш выбор: ",X," цена: ",A,"\n"), !.
continue_selection('2', X, A) :-  !, tel(X, Z), Z < A, write("-->>", X, " - ", A).
goal
  makewindow(1,10,12," Экспертная система : СОТОВЫЕ ТЕЛЕФОНЫ ",0,0,25,80),
  write("--------------------------------------------"),nl,
  run. 