SWI Prolog中的用户输入,回车问题

时间:2014-08-12 07:34:44

标签: user-input swi-prolog

我在使用get/1get0/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中有一个吗?

2 个答案:

答案 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