|
% Expert system should be started from here
| main :- |
| |
intro, |
| |
reset_answers, |
| |
find_language(Language), |
| |
describe(Language), nl. |
| |
|
| |
|
| |
intro :- |
| |
write('Which programming language should I learn first?'), nl, |
| |
write('To answer, input the number shown next to each answer, followed by a dot (.)'), nl, nl. |
| |
|
| |
|
| |
find_language(Language) :- |
| |
language(Language), !. |
| |
|
| |
|
| |
% Store user answers to be able to track his progress |
| |
:- dynamic(progress/2). |
| |
|
| |
|
| |
% Clear stored user progress |
| |
% reset_answers must always return true; because retract can return either true |
| |
% or false, we fail the first and succeed with the second. |
| |
reset_answers :- |
| |
retract(progress(_, _)), |
| |
fail. |
| |
reset_answers. |
| |
|
| |
|
| |
% Rules for the knowledge base |
| |
language(python) :- |
| |
why(for_my_kids). |
| |
|
| |
language(python) :- |
| |
why(i_dont_know). |
| |
|
| |
language(java) :- |
| |
why(make_money), |
| |
which_platform(doesn_t_matter). |
| |
|
| |
language(cpp) :- |
| |
why(make_money), |
| |
which_platform(gaming). |
| |
|
| |
language(objectivec) :- |
| |
why(make_money), |
| |
which_platform(mobile), |
| |
which_mobile_os(ios). |
| |
|
| |
language(java) :- |
| |
why(make_money), |
| |
which_platform(mobile), |
| |
which_mobile_os(android). |
| |
|
| |
language(python) :- |
| |
why(make_money), |
| |
which_platform(facebook). |
| |
|
| |
language(python) :- |
| |
why(make_money), |
| |
which_platform(google). |
| |
|
| |
language(csharp) :- |
| |
why(make_money), |
| |
which_platform(microsoft). |
| |
|
| |
language(objectivec) :- |
| |
why(make_money), |
| |
which_platform(apple). |
| |
|
| |
language(javascript) :- |
| |
why(make_money), |
| |
which_platform(web), |
| |
web(front_end). |
| |
|
| |
language(csharp) :- |
| |
why(make_money), |
| |
which_platform(web), |
| |
web(back_end), |
| |
want_to_work_for(corporate), |
| |
think_about_microsoft(im_a_fan). |
| |
|
| |
language(java) :- |
| |
why(make_money), |
| |
which_platform(web), |
| |
web(back_end), |
| |
want_to_work_for(corporate), |
| |
think_about_microsoft(not_bad). |
| |
|
| |
language(java) :- |
| |
why(make_money), |
| |
which_platform(web), |
| |
web(back_end), |
| |
want_to_work_for(corporate), |
| |
think_about_microsoft(suck). |
| |
|
| |
language(javascript) :- |
| |
why(make_money), |
| |
which_platform(web), |
| |
web(back_end), |
| |
want_to_work_for(startup), |
| |
try_something_new(yes). |
| |
|
| |
language(python) :- |
| |
why(make_money), |
| |
which_platform(web), |
| |
web(back_end), |
| |
want_to_work_for(startup), |
| |
try_something_new(no), |
| |
favourite_toy(lego). |
| |
|
| |
language(ruby) :- |
| |
why(make_money), |
| |
which_platform(web), |
| |
web(back_end), |
| |
want_to_work_for(startup), |
| |
try_something_new(no), |
| |
favourite_toy(play_doh). |
| |
|
| |
language(php) :- |
| |
why(make_money), |
| |
which_platform(web), |
| |
web(back_end), |
| |
want_to_work_for(startup), |
| |
try_something_new(no), |
| |
favourite_toy(old_ugly). |
| |
|
| |
language(csharp) :- |
| |
why(make_money), |
| |
which_platform(enterprise), |
| |
think_about_microsoft(im_a_fan). |
| |
|
| |
language(java) :- |
| |
why(make_money), |
| |
want_to_work_for(enterprise), |
| |
think_about_microsoft(not_bad). |
| |
|
| |
language(java) :- |
| |
why(make_money), |
| |
want_to_work_for(enterprise), |
| |
think_about_microsoft(suck). |
| |
|
| |
language(python) :- |
| |
why(just_for_fun), |
| |
prefer_to_learn(easy_way). |
| |
|
| |
language(python) :- |
| |
why(just_for_fun), |
| |
prefer_to_learn(best_way). |
| |
|
| |
language(java) :- |
| |
why(just_for_fun), |
| |
prefer_to_learn(harder_way), |
| |
car(auto). |
| |
|
| |
language(c) :- |
| |
why(just_for_fun), |
| |
prefer_to_learn(harder_way), |
| |
car(manual). |
| |
|
| |
language(cpp) :- |
| |
why(just_for_fun), |
| |
prefer_to_learn(hardest_way). |
| |
|
| |
language(python) :- |
| |
why(im_interested), |
| |
prefer_to_learn(easy_way). |
| |
|
| |
language(python) :- |
| |
why(im_interested), |
| |
prefer_to_learn(best_way). |
| |
|
| |
language(java) :- |
| |
why(im_interested), |
| |
prefer_to_learn(harder_way), |
| |
car(auto). |
| |
|
| |
language(c) :- |
| |
why(im_interested), |
| |
prefer_to_learn(harder_way), |
| |
car(manual). |
| |
|
| |
language(cpp) :- |
| |
why(im_interested), |
| |
prefer_to_learn(hardest_way). |
| |
|
| |
language(python) :- |
| |
why(improve_myself), |
| |
prefer_to_learn(easy_way). |
| |
|
| |
language(python) :- |
| |
why(improve_myself), |
| |
prefer_to_learn(best_way). |
| |
|
| |
language(java) :- |
| |
why(improve_myself), |
| |
prefer_to_learn(harder_way), |
| |
car(auto). |
| |
|
| |
language(c) :- |
| |
why(improve_myself), |
| |
prefer_to_learn(harder_way), |
| |
car(manual). |
| |
|
| |
language(cpp) :- |
| |
why(improve_myself), |
| |
prefer_to_learn(hardest_way). |
| |
|
| |
|
| |
% Questions for the knowledge base |
| |
question(why) :- |
| |
write('Why do you want to learn programming?'), nl. |
| |
|
| |
question(which_platform) :- |
| |
write('Which platform/field?'), nl. |
| |
|
| |
question(which_mobile_os) :- |
| |
write('Which OS?'), nl. |
| |
|
| |
question(web) :- |
| |
write('Which "end"?'), nl. |
| |
|
| |
question(want_to_work_for) :- |
| |
write('I want to work for...'), nl. |
| |
|
| |
question(think_about_microsoft) :- |
| |
write('What do you think about Microsoft?'), nl. |
| |
|
| |
question(try_something_new) :- |
| |
write('Do you want to try something new, with huge potential, but less mature?'), nl. |
| |
|
| |
question(favourite_toy) :- |
| |
write('Which one is your favourite toy?'), nl. |
| |
|
| |
question(prefer_to_learn) :- |
| |
write('I prefer to learn things...'), nl. |
| |
|
| |
question(car) :- |
| |
write('Auto or Manual car?'), nl. |
| |
|
| |
|
| |
% Answers for the knowledge base |
| |
answer(for_my_kids) :- |
| |
write('For my kids'). |
| |
|
| |
answer(i_dont_know) :- |
| |
write('I don\'t know'). |
| |
|
| |
answer(make_money) :- |
| |
write('Make money'). |
| |
|
| |
answer(just_for_fun) :- |
| |
write('Just for fun'). |
| |
|
| |
answer(im_interested) :- |
| |
write('I\'m interested'). |
| |
|
| |
answer(improve_myself) :- |
| |
write('Improve myself'). |
| |
|
| |
answer(doesn_t_matter) :- |
| |
write('Doesn\'t matter, I just want $$$'). |
| |
|
| |
answer(gaming) :- |
| |
write('3D/Gaming'). |
| |
|
| |
answer(mobile) :- |
| |
write('Mobile'). |
| |
|
| |
answer(facebook) :- |
| |
write('Facebook'). |
| |
|
| |
answer(google) :- |
| |
write('Google'). |
| |
|
| |
answer(microsoft) :- |
| |
write('Microsoft'). |
| |
|
| |
answer(apple) :- |
| |
write('Apple'). |
| |
|
| |
answer(web) :- |
| |
write('Web'). |
| |
|
| |
answer(enterprise) :- |
| |
write('Enterprise'). |
| |
|
| |
answer(ios) :- |
| |
write('iOS'). |
| |
|
| |
answer(android) :- |
| |
write('Android'). |
| |
|
| |
answer(front_end) :- |
| |
write('Front-end (web interface)'). |
| |
|
| |
answer(back_end) :- |
| |
write('Back-end ("brain" behind a website)'). |
| |
|
| |
answer(startup) :- |
| |
write('Startup'). |
| |
|
| |
answer(corporate) :- |
| |
write('Corporate'). |
| |
|
| |
answer(im_a_fan) :- |
| |
write('I\'m a fan!'). |
| |
|
| |
answer(not_bad) :- |
| |
write('Not Bad'). |
| |
|
| |
answer(suck) :- |
| |
write('Suck'). |
| |
|
| |
answer(yes) :- |
| |
write('Yes'). |
| |
|
| |
answer(no) :- |
| |
write('No'). |
| |
|
| |
answer(lego) :- |
| |
write('Lego'). |
| |
|
| |
answer(play_doh) :- |
| |
write('Play-Doh'). |
| |
|
| |
answer(old_ugly) :- |
| |
write('I\'ve an old & ugly toy, but I love it so much!'). |
| |
|
| |
answer(easy_way) :- |
| |
write('The easy way'). |
| |
|
| |
answer(best_way) :- |
| |
write('The best way'). |
| |
|
| |
answer(harder_way) :- |
| |
write('The slightly harder way'). |
| |
|
| |
answer(hardest_way) :- |
| |
write('The really hard way (but easier to pick up other languages in the future)'). |
| |
|
| |
answer(auto) :- |
| |
write('Auto'). |
| |
|
| |
answer(manual) :- |
| |
write('Manual'). |
| |
|
| |
|
| |
% Language descriptions for the knowledge base |
| |
describe(python) :- |
| |
write('Python'), nl, |
| |
write('Widely regarded as the best programming language for beginners'), nl, |
| |
write('Easiest to learn'). |
| |
|
| |
describe(java) :- |
| |
write('Java'), nl, |
| |
write('One of the most in demand & highest paying programming languages'), nl, |
| |
write('Slogan: write once, work everywhere'). |
| |
|
| |
describe(c) :- |
| |
write('C'), nl, |
| |
write('Lingua franca of programming language'), nl, |
| |
write('One of the oldest and most widely used language in the world'). |
| |
|
| |
describe(cpp) :- |
| |
write('C++'), nl, |
| |
write('Complex version of C with a lot more features'), nl, |
| |
write('Recommended only if you have a mentor to guide you'). |
| |
|
| |
describe(javascript) :- |
| |
write('JavaScript'), nl, |
| |
write('Most popular clients-side web scripting language'), nl, |
| |
write('A must learn for front-end web developer (HTML and CSS as well)'). |
| |
|
| |
describe(csharp) :- |
| |
write('C#'), nl, |
| |
write('A popular choice for enterprise to create websites and Windows application using .NET framework'), nl, |
| |
write('Similar to Java in basic syntax and some features'). |
| |
|
| |
describe(ruby) :- |
| |
write('Ruby'), nl, |
| |
write('Mostly known for its popular web framework, Ruby on Rails'), nl, |
| |
write('Focuses on getting things done'). |
| |
|
| |
describe(php) :- |
| |
write('PHP'), nl, |
| |
write('Suitable for building small and simple sites within a short time frame'), nl, |
| |
write('Supported by almost every web hosting services with lower price'). |
| |
|
| |
describe(objectivec) :- |
| |
write('Objective-C'), nl, |
| |
write('Primary language used by Apple for MacOSX & iOS'), nl, |
| |
write('Choose this if you want to focus on developing iOS or OSX apps only'). |
| |
|
| |
|
| |
% Assigns an answer to questions from the knowledge base |
| |
why(Answer) :- |
| |
progress(why, Answer). |
| |
why(Answer) :- |
| |
\+ progress(why, _), |
| |
ask(why, Answer, [for_my_kids, i_dont_know, make_money, just_for_fun, im_interested, improve_myself]). |
| |
|
| |
which_platform(Answer) :- |
| |
progress(which_platform, Answer). |
| |
which_platform(Answer) :- |
| |
\+ progress(which_platform, _), |
| |
ask(which_platform, Answer, [doesn_t_matter, gaming, mobile, facebook, google, microsoft, apple, web, enterprise]). |
| |
|
| |
which_mobile_os(Answer) :- |
| |
progress(which_mobile_os, Answer). |
| |
which_mobile_os(Answer) :- |
| |
\+ progress(which_mobile_os, _), |
| |
ask(which_mobile_os, Answer, [ios, android]). |
| |
|
| |
web(Answer) :- |
| |
progress(web, Answer). |
| |
web(Answer) :- |
| |
\+ progress(web, _), |
| |
ask(web, Answer, [front_end, back_end]). |
| |
|
| |
want_to_work_for(Answer) :- |
| |
progress(want_to_work_for, Answer). |
| |
want_to_work_for(Answer) :- |
| |
\+ progress(want_to_work_for, _), |
| |
ask(want_to_work_for, Answer, [startup, corporate]). |
| |
|
| |
think_about_microsoft(Answer) :- |
| |
progress(think_about_microsoft, Answer). |
| |
think_about_microsoft(Answer) :- |
| |
\+ progress(think_about_microsoft, _), |
| |
ask(think_about_microsoft, Answer, [im_a_fan, not_bad, suck]). |
| |
|
| |
try_something_new(Answer) :- |
| |
progress(try_something_new, Answer). |
| |
try_something_new(Answer) :- |
| |
\+ progress(try_something_new, _), |
| |
ask(try_something_new, Answer, [yes, no]). |
| |
|
| |
favourite_toy(Answer) :- |
| |
progress(favourite_toy, Answer). |
| |
favourite_toy(Answer) :- |
| |
\+ progress(favourite_toy, _), |
| |
ask(favourite_toy, Answer, [lego, play_doh, old_ugly]). |
| |
|
| |
prefer_to_learn(Answer) :- |
| |
progress(prefer_to_learn, Answer). |
| |
prefer_to_learn(Answer) :- |
| |
\+ progress(prefer_to_learn, _), |
| |
ask(prefer_to_learn, Answer, [easy_way, best_way, harder_way, hardest_way]). |
| |
|
| |
car(Answer) :- |
| |
progress(car, Answer). |
| |
car(Answer) :- |
| |
\+ progress(car, _), |
| |
ask(car, Answer, [auto, manual]). |
| |
|
| |
|
| |
% Outputs a nicely formatted list of answers |
| |
% [First|Rest] is the Choices list, Index is the index of First in Choices |
| |
answers([], _). |
| |
answers([First|Rest], Index) :- |
| |
write(Index), write(' '), answer(First), nl, |
| |
NextIndex is Index + 1, |
| |
answers(Rest, NextIndex). |
| |
|
| |
|
| |
% Parses an Index and returns a Response representing the "Indexth" element in |
| |
% Choices (the [First|Rest] list) |
| |
parse(0, [First|_], First). |
| |
parse(Index, [First|Rest], Response) :- |
| |
Index > 0, |
| |
NextIndex is Index - 1, |
| |
parse(NextIndex, Rest, Response). |
| |
|
| |
|
| |
% Asks the Question to the user and saves the Answer |
| |
ask(Question, Answer, Choices) :- |
| |
question(Question), |
| |
answers(Choices, 0), |
| |
read(Index), |
| |
parse(Index, Choices, Response), |
| |
asserta(progress(Question, Response)), |
| |
Response = Answer. |
|