prolog - 读取用户输入并将字符串匹配结果分配给参数
问题描述
我需要编写一个读取用户输入的谓词。如果输入是“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.
我究竟做错了什么 ?
解决方案
您做错的是您正在将使用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.
推荐阅读
- gnuplot - gnuplot 5.0.3 中的 xrange 问题
- python-3.x - IBM Spectrum LSF - 访问不同 HPC 节点上的多个 GPU
- java - Spring Boot 与 Spock 的集成测试:存根方法返回 null
- android - Android DJI SDK 创建海量日志文件
- reactjs - ReactJS/TypeScript - 类型“HTMLElement”错误中不存在属性“文件”
- scala - 在 scala 中,如何将期货列表转换为返回第一个成功未来的未来?
- ios - 将序列与 CloudKit 同步的最佳方法是什么?
- java - 根据条件从同一方法返回两种不同的数据类型
- bash - 如何遍历文件并在bash中应用日期?
- .net - EntLib 4.1 中的 Oracle.ManagedDataAccess.Client 错误“连接字符串格式不正确”