将用户输入与定义的谓词进行比较
Compare user input to defined predicate
我正在尝试创建一个“Who Is It”游戏(猜人部分)。
我想检查用户输入是否等于保存在谓词中的 value/person。
基于此,如果 value/person 是否被猜到,我将向用户 return。
每次将菜单返回到用户界面时,都会从名为 characters
的列表中选择随机人物。
我需要使用哪个库,或者我将如何实现这种评估?
:- dynamic xxxxxxxxxxxx/1.
%characteristics of a person/character
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
male(bill).
male(alfred).
female(claire).
female(anne).
bald(bill).
beard(bill).
beard(alfred).
blushes(bill).
redshirt(alfred).
hat(claire).
blond(claire).
dress(anne).
earrings(anne).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
chosen_character(_).
menu :-
write('Possible characters to choose from:'),nl,
characters(L), write(L),nl,
read(Input),
%CODE THAT COMPARES INPUT TO 'chosen_character' AND RETURNS NAME IF CORRECT ELSE GUESS AGAIN.
menu.
character(L) :- findall(X, (male(X) ; female(X)), L).
new_character(Ans):-
characters(L),
length(L, X),
R is random(X),
N is R+1,
random_between(L, N, Ans),
chosen_character(Ans).
random_between([H|T],1,H).
random_between([H|T],N,E):-
N1 is N-1,
random_between(T,N1,E1),
E=E1.
假设您已经有一个可以选择的名称列表(由谓词 characters/1
定义)并且您正在使用 SWI-Prolog(因为问题最初被标记为 swi-prolog
),可能的解决方案如下:
characters([bill, alfred, claire, anne]).
guess :-
characters(Names),
random_member(Name, Names),
guess(Name).
guess(Name) :-
characters(Names),
format(atom(Prompt), '\nChoose one of ~w: ', [Names]),
prompt1(Prompt),
read_line_to_string(user_input, String),
atom_string(Atom, String),
( Atom = Name
-> format('Your guess is correct!\n')
; format('Your guess is incorrect!\n'),
guess(Name) ).
请注意,SWI-Prolog 已经有一些对这个应用程序非常有用的内置谓词 (random_member/2, format/3, prompt1/1, read_line_to_string/2, and atom_string/2)。
运行 示例:
?- guess.
Choose one of [bill,alfred,claire,anne]: anne
Your guess is incorrect!
Choose one of [bill,alfred,claire,anne]: bill
Your guess is incorrect!
Choose one of [bill,alfred,claire,anne]: claire
Your guess is correct!
true.
我正在尝试创建一个“Who Is It”游戏(猜人部分)。
我想检查用户输入是否等于保存在谓词中的 value/person。 基于此,如果 value/person 是否被猜到,我将向用户 return。
每次将菜单返回到用户界面时,都会从名为 characters
的列表中选择随机人物。
我需要使用哪个库,或者我将如何实现这种评估?
:- dynamic xxxxxxxxxxxx/1.
%characteristics of a person/character
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
male(bill).
male(alfred).
female(claire).
female(anne).
bald(bill).
beard(bill).
beard(alfred).
blushes(bill).
redshirt(alfred).
hat(claire).
blond(claire).
dress(anne).
earrings(anne).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
chosen_character(_).
menu :-
write('Possible characters to choose from:'),nl,
characters(L), write(L),nl,
read(Input),
%CODE THAT COMPARES INPUT TO 'chosen_character' AND RETURNS NAME IF CORRECT ELSE GUESS AGAIN.
menu.
character(L) :- findall(X, (male(X) ; female(X)), L).
new_character(Ans):-
characters(L),
length(L, X),
R is random(X),
N is R+1,
random_between(L, N, Ans),
chosen_character(Ans).
random_between([H|T],1,H).
random_between([H|T],N,E):-
N1 is N-1,
random_between(T,N1,E1),
E=E1.
假设您已经有一个可以选择的名称列表(由谓词 characters/1
定义)并且您正在使用 SWI-Prolog(因为问题最初被标记为 swi-prolog
),可能的解决方案如下:
characters([bill, alfred, claire, anne]).
guess :-
characters(Names),
random_member(Name, Names),
guess(Name).
guess(Name) :-
characters(Names),
format(atom(Prompt), '\nChoose one of ~w: ', [Names]),
prompt1(Prompt),
read_line_to_string(user_input, String),
atom_string(Atom, String),
( Atom = Name
-> format('Your guess is correct!\n')
; format('Your guess is incorrect!\n'),
guess(Name) ).
请注意,SWI-Prolog 已经有一些对这个应用程序非常有用的内置谓词 (random_member/2, format/3, prompt1/1, read_line_to_string/2, and atom_string/2)。
运行 示例:
?- guess.
Choose one of [bill,alfred,claire,anne]: anne
Your guess is incorrect!
Choose one of [bill,alfred,claire,anne]: bill
Your guess is incorrect!
Choose one of [bill,alfred,claire,anne]: claire
Your guess is correct!
true.