我在使用get/1
或get0/1
时遇到问题。在SWI-Prolog的两种情况下都有回车
需要完成用户输入。在递归中使用它,这个回车似乎
被重新激活"在下一个递归循环中。结果,不再能输入用户输入。怎么了?
我的测试代码:
test_userinput:-
repeat,
ask_user(Input),
write('You said: \n'),
write(Input),nl,
confirmation,
write('I understood.\n'),
define_end(Input).
end_of_use([x,'X','Q',q,a,'A',end,'END',e,'E']).
define_end(Input) :-
end_of_use(EndOfUse),
member(Input,EndOfUse).
ask_user(Input) :-
write('Pleaser enter a word or two:\n'),
read_line_to_codes(user_input,CodeInput),
atom_codes(Input,CodeInput).
confirmation :-
write('Right? [y/n]'),
get0(YN),
atom_codes(Input,[YN]),
member(Input,['y','Y']).
我的输出
8 ?- test_userinput.
Pleaser enter a word or two:
|: Hello World
You said:
Hello World
Right? [y/n] y
I understood.
Pleaser enter a word or two:
You said:
Right? [y/n] n
Pleaser enter a word or two:
You said:
Right? [y/n]
Action (h for help) ? abort
使用read_line_to_codes/2
代替get0/1
,它可以运作:
read_line_to_codes(user_input,CodeInput),
atom_codes(Input,CodeInput),
输出
14 ?- test_userinput.
Pleaser enter a word or two:
| Hello World
You said:
Hello World
Right? [y/n] y
I understood.
Pleaser enter a word or two:
| ... and now without carriage return
You said:
... and now without carriage return
Right? [y/n] n
Pleaser enter a word or two:
| end
You said:
end
Right? [y/n] y
I understood.
true .
将是一个有效的解决方案,但我正在寻找一种方法 不需要用户输入的回车。在SWI Prolog中有一个吗?
答案 0 :(得分:1)
当您只需要阅读单个字符时,可以使用get_single_char/1
内置谓词。如果您还想回显用户输入的字符,您可以定义谓词,例如:
read_single_char(Char) :-
get_single_char(Code), put_code(Code), nl, char_code(Char, Code).
有关详细信息,请参阅http://www.swi-prolog.org/pldoc/doc_for?object=get_single_char/1。但请注意,Carlos的解决方案是可移植的,而get_single_char/1
谓词是特定于SWI-Prolog的。
答案 1 :(得分:0)
我认为您需要捕获输入字符:
confirmation :-
write('Right? [y/n]'),
get_char(YN),
get_code(_),
member(YN,['y','Y']).
注意:不推荐使用get / 1和get0 / 1