How to modify my Turbo Prolog expert system

31 views Asked by At

I have Turbo Prolog expert system on rules that searching music albums based on answer of user about genres of this albums. I've modified that system and now user can answer "maybe" if he don't know if this album includes this specific genre or not. That means that the user might get several answers from the system and now i have to count and display probabilities of each answer.

I mean if user will get for ex: at first THINK LATER - Tate McRae with 60% and then Number 1 - Charli XCX with 40%.

My expert system:

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

predicates
  repeat
  run
  album(string)
  is(string)
  positive(string)
  negative(string)
  xpositive(string)
  xnegative(string)
  ask(string,char)
  remember(string,char)
  delete_all
clauses
  repeat.
  repeat:-repeat.

%-----------------------------------------------------------------------------
% albums
  album("Cold As Ice - Ava Max"):-is("EP"),is("Mixtape"),positive("Pop"),positive("R&B"),
                 positive("Electropop"),
                 negative("House"),negative("Hip-Hop"),negative("Trap-pop").

  album("AR - Addison Rae"):-is("EP"),is("Mixtape"), positive("Pop"),negative("R&B"),
                 positive("Electropop"),
                 negative("House"),negative("Hip-Hop"),positive("Trap-pop").

  album("After School - Melanie Martinez"):-is("EP"),positive("Pop"),negative("R&B"),
                 positive("Electropop"),
                 positive("House"),negative("Hip-Hop"),negative("Trap-pop").

  album("TYLA - Tyla"):-is("EP"), negative("Pop"),positive("R&B"),
                 negative("Electropop"),
                 positive("House"),negative("Hip-Hop"),negative("Trap-pop").

  album("Honor The Light - Zara Larson"):-is("EP"), positive("Pop"),negative("R&B"),
                 negative("Electropop"),
                 positive("House"),negative("Hip-Hop"),negative("Trap-pop").



  album("Barbie The Album"):-is("Standart"),is("Box_set"),positive("Pop"),negative("R&B"),
                 positive("Electropop"),
                 negative("House"),negative("Hip-Hop"),positive("Trap-pop").

  album("Eternal sunshine - Ariana Grande"):-is("Standart"),is("Box_set"), negative("Pop"),positive("R&B"),
                 negative("Electropop"),
                 positive("House"),negative("Hip-Hop"),negative("Trap-pop").

  album("Midnights - Taylor Swift"):-is("Standart"), is("Box_set"), positive("Pop"),positive("R&B"),
                 positive("Electropop"),
                 positive("House"),negative("Hip-Hop"),negative("Trap-pop").

  album("Beam me up Scotty - Nicki Minaj"):-is("Standart"),is("Mixtape"), negative("Pop"),negative("R&B"),
                 negative("Electropop"),
                 negative("House"),positive("Hip-Hop"),positive("Trap-pop").

  album("Number 1 - Charli XCX"):-is("Standart"),is("Mixtape"), positive("Pop"),negative("R&B"),
                 positive("Electropop"),
                 negative("House"),negative("Hip-Hop"),positive("Trap-pop").

  album("The Pinkprint - Nicki Minaj"):-is("Standart"), positive("Pop"),negative("R&B"),
                 negative("Electropop"),
                 positive("House"),positive("Hip-Hop"),negative("Trap-pop").

  album("Thank you next - Ariana Grande"):-is("Standart"), positive("Pop"),positive("R&B"),
                 negative("Electropop"),
                 positive("House"),positive("Hip-Hop"),negative("Trap-pop").

  album("THINK LATER - Tate McRae"):-is("Standart"), positive("Pop"),negative("R&B"),
                 positive("Electropop"),
                 negative("House"),negative("Hip-Hop"),positive("Trap-pop").

  album("Something To Give Each Other - Troye Sivan"):-is("Standart"), negative("Pop"),negative("R&B"),
                 positive("Electropop"),
                 negative("House"),negative("Hip-Hop"),positive("Trap-pop").

  album("Venus - Zara Larson"):- is("Standart"),negative("Pop"),positive("R&B"),
                 negative("Electropop"),
                 positive("House"),positive("Hip-Hop"),negative("Trap-pop").



  album("I don't know this album. I'm so sorry :c ").

%-----------------------------------------------------------------------------
  is("Mixtape"):-positive("mixed sounding").
  is("EP"):-negative("lasts 30 - 80 minutes").
  is("Standart"):-positive("lasts 30 - 80 minutes").
  is("Box_set"):-positive("3 or more parts in 1").
%-----------------------------------------------------------------------------
% работа с динамической базой данных
  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("Answers (y - yes, n - no, q - don't know).\n"),
       album(X),
       write("This album is : ",X,"\n"),
       write("Do you want to exit? (y/n): "),readchar(Z),
       write(Z),nl,
       Z='y'.
goal
  makewindow(1,10,12," Expert system : Music albums ",0,0,25,80),
  write(" Music in your veins"),nl,
  write(" Sound of music from Prolog-Mashine for You."),nl,
  write("--------------------------------------------"),nl,
  run.
0

There are 0 answers