首页 > 解决方案 > 读取用户输入并将字符串匹配结果分配给参数

问题描述

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

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

输出是:

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

A = false.

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

A = false.

我究竟做错了什么 ?

标签: prolog

解决方案


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

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

您可以使用其他东西代替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
    ).

这将正确识别“是”、“是”、“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.

推荐阅读