Я хочу дать определенное значение write/1
в случае сбоя предиката:
Таким образом, чат запускает этот цикл только после получения ввода «пока».
Но если процесс завершится неудачей из-за, скажем, некорректного ввода, я хочу написать как «Неправильно», но все еще оставаться в цикле чата.
chat:-
repeat,
readinput(Input),
process(Input),
(Input = [bye| _] ),!.
Так что это просто повторяется, если процесс не удается,
?- chat.
|: oooo
|: poppsps
|: looool
|: pjpkpkpl
|: bye
> bye!
true.
Я сделал это:
chat:-
repeat,
readinput(Input),
(process(Input);write('WRONG') ),
(Input = [bye| _] ),!.
, который обрабатывает, если процесс завершается неудачей, но он просто остается неправильным,
?- chat.
|: ooo
WRONG
WRONG
WRONG
WRONG
WRONG
WRONG
WRONG
WRONG
если я сделаю ставку, она выйдет из чата:
chat:-
repeat,
readinput(Input),
(process(Input);write('WRONG'), ! ),
(Input = [bye| _] ),!.
?- chat.
|: pop
WRONG
false.
?-
Процесс внутренне имеет этот предикат синтаксического анализа, который не выполняется при неправильном вводе.
Поэтому я попытался найти, когда в синтаксическом разборе есть переменная без значения SemanticRepresentation, и передается 1 в Zeta, и происходит сбой после записи:
process(Input):-
parse(Input,SemanticRepresentation, Zeta),
( Zeta == 1 ->
writeln('Wrong \n Failing Now'), fail;
sat([],SemanticRepresentation,ModelResponse)
), ..... do more stuff
Где parse/3
определяется как:
parse(Sentence,Parse, Zeta):-
srparse([],Sentence,Parse),
(nonvar(Parse) ->
write('not free variable'), nl, write(Parse),
Zeta = 1;
write('Free Variable'), nl, write(Parse),
Zeta = 0).
это работает несколько, но, наоборот, не подходит для правильного предложения. :
?- chat.
|: asfafaf
|: afsgsg
|: sgregergerge
|: rgergergerge
|: asfsfsf
|: a blue box contains some ham
not free variable
s(exists(_G2515,and(and(box(_G2515),blue(_G2515)),exists(_G2602,and(ham(_G2602),contain(_G2515,_G2602))))),[])wrong
not free variable
s(exists(_G2515,and(and(box(_G2515),blue(_G2515)),exists(_G2602,and(ham(_G2602),contain(_G2515,_G2602))))),[])wrong
|:
Я новичок в прологе,
Таким образом, вопрос заключается в том, каков специальный способ сообщения об ошибках. Как мне изящно справиться с ошибкой предиката?
Должен ли я работать с использованием nonvar, я обращаюсь с ним как с прерывателем if else в главном цикле?
Я использую try / catch ?? Может кто-нибудь помочь мне с обработкой ошибок в Прологе?
nonvar ()