将用户输入与定义的谓词进行比较

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.