读取用户输入并将字符串匹配结果分配给参数

Tra*_*lio 3 prolog

我需要编写一个读取用户输入的谓词。如果输入为“yes”(理想情况下为“yes”或“y”),则必须为参数分配“yes”,如果有任何不同,则必须分配“no”。

askContinue(Answer) :-
    write("Would you like to continue ?  "), read(Input), nl,
    (Input = "yes" -> Answer = true ; Answer = false).
Run Code Online (Sandbox Code Playgroud)

输出是:

?- askContinue(A).
Would you like to continue ? yes.

A = false.

?- askContinue(A).
Would you like to continue ? no.

A = false.
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么 ?

TA_*_*ern 5

你做错的是你正在将你读取的原子read与字符串进行比较。相反,将其与原子进行比较(单引号或无引号):

askContinue(Answer) :-
    write("Would you like to continue ?  "), read(Input), nl,
    (Input = yes -> Answer = true ; Answer = false).
Run Code Online (Sandbox Code Playgroud)

您可以使用其他东西来代替read。也许您不想.在回答后输入“”。如果您阅读直到按下 Enter 键:

ask(Prompt, Answer) :-
    prompt1(Prompt),
    read_string(current_input, "\n", " \t", _Sep, Response),
    response_answer(Response, Answer).

response_answer(Response, Answer) :-
    string_lower(Response, R),
    (   memberchk(R, ["y", "yes"])
    ->  Answer = yes
    ;   Answer = no
    ).
Run Code Online (Sandbox Code Playgroud)

这将正确识别“是”、“是”、“y”、“Y”等。

?- ask("Would you like to continue? ", Answer).
Would you like to continue? Y
Answer = yes.

?- ask("Would you like to continue? ", Answer).
Would you like to continue? Yeah
Answer = no.
Run Code Online (Sandbox Code Playgroud)