Пролог - повторять ввод до тех пор, пока

Я хочу создать предикат, который принимает только определенный ввод от пользователя и будет продолжать запрашивать правильный ввод, если пользователь вводит неправильный ввод. Я создал это, но он не завершен, потому что он не запрашивает новый ввод, если он неправильный:

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.

person user2880113    schedule 03.11.2013    source источник


Ответы (2)


в системах, в которых отсутствует приличная хвостовая рекурсивная оптимизация, обработка побочных эффектов может быть удобно выполнена с помощью цикла, управляемого сбоем.

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 .
person CapelliC    schedule 03.11.2013
comment
каждый раз, когда пользователь вводит неправильный символ, он должен видеть сообщение о том, что символ недействителен, введите допустимый символ. Этот порез красный порез? Как я могу использовать только зеленые сокращения в этом предикате? Можно ли не использовать предикат повторения? - person user2880113; 03.11.2013
comment
Я был вокруг этого в течение нескольких часов и не могу найти решение! - person user2880113; 04.11.2013
comment
@mat: да, я имел в виду ответ пользователя после того, как проголосовал за него. Мое объяснение должно быть более подробным, но писать по-английски немного больно... Я предпочитаю Пролог :). Во всяком случае, в моем старом интерпретаторе Пролога у меня была хвостовая рекурсия, но не такая приличная... - person CapelliC; 05.11.2013

Вот что я получил:

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).

Он спрашивает снова и снова, пока не будет введен символ s.

person User    schedule 03.11.2013
comment
askChar(X) должен вернуть символ, прошедший тест. Должны быть два принятых символа, а не только s. И каждый раз, когда пользователь вводит неправильный символ, он должен видеть сообщение о том, что символ недействителен, введите другой символ. - person user2880113; 03.11.2013