如何为Turbo Prolog音乐专辑专家系统添加概率计算展示功能
Turbo Prolog音乐专辑搜索专家系统:概率匹配展示实现需求
我有一个基于Turbo Prolog的音乐专辑搜索专家系统,可根据用户对音乐风格的回答匹配对应专辑。目前已修改系统,支持用户在不确定专辑是否包含特定风格时回答“maybe”,此时系统会返回多个专辑结果。现在需要实现对每个结果的概率统计并展示,要求按概率排序显示,例如:
- THINK LATER - Tate McRae(60%)
- Number 1 - Charli XCX(40%)
现有系统代码如下:
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.
内容的提问来源于stack exchange,提问作者Seryozhka
相关产品推荐
相关产品推荐

