Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- % Start Konwledge Base
- /* Bird */
- bird(laysan_albatross):-
- family(albatross),
- color(white).
- bird(black_footed_albatross):-
- family(albatross),
- color(dark).
- bird(whistling_swan) :-
- family(swan),
- voice(muffled_musical_whistle).
- bird(trumpeter_swan) :-
- family(swan),
- voice(loud_trumpeting).
- bird(canada_goose):-
- family(goose),
- season(winter),
- country(united_states),
- head(black),
- cheek(white).
- bird(canada_goose):-
- family(goose),
- season(summer),
- country(canada),
- head(black),
- cheek(white).
- bird(mallard):-
- family(duck),
- voice(quack),
- head(green).
- bird(mallard):-
- family(duck),
- voice(quack),
- color(mottled_brown).
- /* Order */
- order(tubenose) :-
- nostrils(external_tubular),
- live(at_sea),
- bill(hooked).
- order(waterfowl) :-
- feet(webbed),
- bill(flat).
- /* Family */
- family(albatross) :-
- order(tubenose),
- size(large),
- wings(long_narrow).
- family(swan) :-
- order(waterfowl),
- neck(long),
- color(white),
- flight(ponderous).
- /* Country */
- country(united_states):- region(mid_west).
- country(united_states):- region(south_west).
- country(united_states):- region(north_west).
- country(united_states):- region(mid_atlantic).
- country(canada):- province(ontario).
- country(canada):- province(quebec).
- /* Region */
- region(new_england):-
- state(X),
- member(X, [massachusetts, vermont, ....]).
- region(south_east):-
- state(X),
- member(X, [florida, mississippi, ....]).
- % End Knowledge Base
- % Start Native
- /* Asking the user */
- nostrils(X):- ask(nostrils, X).
- live(X):- ask(live, X).
- bill(X):- ask(bill, X).
- % size(X):- ask(size, X).
- wings(X):- ask(wings, X).
- color(X):- ask(color, X).
- /* Menus for user */
- size(X):-
- menuask(size, X, [large, plump, medium, small]).
- flight(X):-
- menuask(flight, X, [ponderous, agile, flap_glide]).
- /* Multi-valued answer */
- multivalued(voice).
- multivalued(feed).
- /* Remembering the answer */
- ask(A, V):-
- known(yes, A, V), % succeed if true
- !. % stop looking
- ask(A, V):-
- known(_, A, V), % fail if false
- !,
- fail.
- ask(A, V):-
- write(A:V), % ask user
- write('? : '),
- read(Y), % get the answer
- asserta(known(Y, A, V)), % remember it
- Y == yes. % succeed or fail
- ask(A, V):-
- not(multivalued(A)),
- known(yes, A, V2),
- V \== V2,
- !,
- fail.
- menuask(A, V, MenuList) :-
- write('What is the value for'), write(A), write('?'), nl,
- write(MenuList), nl,
- read(X),
- check_val(X, A, V, MenuList),
- asserta( known(yes, A, X) ),
- X == V.
- check_val(X, _A, _V, MenuList) :-
- member(X, MenuList),
- !.
- check_val(X, A, V, MenuList) :-
- write(X), write(' is not a legal value, try again.'), nl,
- menuask(A, V, MenuList).
- /* Simple shell */
- top_goal(X) :- bird(X).
- solve :-
- abolish(known, 3),
- % define(known, 3),
- top_goal(X),
- write('The answer is '), write(X), nl.
- solve :-
- write('No answer found.'), nl.
- /* Command loop */
- go :-
- greeting,
- repeat,
- write('> '),
- read(X),
- do(X),
- X == quit.
- greeting :-
- write('This is the Native Prolog shell.'), nl,
- write('Enter load, consult, or quit at the prompt.'), nl.
- % Load Custom Knowledge Base
- do(load) :-
- load_kb,
- !.
- % Running Program
- do(consult) :-
- solve,
- !.
- % Quit Program
- do(quit).
- do(X) :-
- write(X),
- write('is not a legal command.'), nl,
- fail.
- load_kb :-
- write('Enter file name: '),
- read(F),
- reconsult(F).
- % End Native
- % Addition
- /* Member Rules */
- member(X,[X|_]).
- member(X,[_|T]):-member(X,T).
- :- unknown(trace,fail).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement