Prolog-重复输入直到

Prolog-重复输入直到,prolog,repeat,Prolog,Repeat,我想创建一个谓词,它只接受用户的特定输入,如果用户输入错误,它将继续请求正确的输入。 我已经创建了这个,但它没有完成,因为如果它错误,它不会要求新的输入: askchar(X):- write('give char'),nl, get_char(X), test(X). test(X):- X=a, write('ok'). %accepts a test(X):- X='1', write('ok'). %accepts 1 test(X):- write('wrong input. try

我想创建一个谓词,它只接受用户的特定输入,如果用户输入错误,它将继续请求正确的输入。 我已经创建了这个,但它没有完成,因为如果它错误,它不会要求新的输入:

askchar(X):- write('give char'),nl, get_char(X), test(X).

test(X):- X=a, write('ok'). %accepts a
test(X):- X='1', write('ok'). %accepts 1
test(X):- write('wrong input. try again'),nl.
以下是我得到的:

askChar(Char) :- get_char(Char), test(Char), write('This is the right char, thank you.'), !.
askChar(Char) :- write('That is wrong char!'), askChar(Char).    

test(s).

它会一次又一次地询问,直到输入字符。

在缺乏像样的尾部递归优化的系统中,可以通过故障驱动循环方便地处理副作用

1 ?- [user].
|: askchar(C) :- repeat, get(C), (C = 0'a ; C = 0'1, ! ; fail).
% user://1 compiled 0.07 sec, 2 clauses
true.

2 ?- askchar(X).
|: 5
|: a

X = 97 .

askChar(X)应该返回通过测试的字符。必须有两个公认的字符,而不仅仅是s。每次用户输入错误字符时,他都会看到消息“该字符无效,请输入另一个字符”。每次用户输入错误字符时,他都会看到消息“该字符无效,请输入有效字符”。那个伤口是红色的?如何在此谓词中仅使用绿色切割?有可能不使用重复谓词吗?我已经讨论了几个小时,找不到解决方案@马特:是的,我是指用户的答案,在我投票后。在我的解释中应该更明确,但是写英语有点痛苦。。。我更喜欢序言:)。不管怎么说,在我以前的Prolog解释器中,我有尾部递归,但不太像样。。。