Как обращаться с Ложью в Прологе - PullRequest
0 голосов
/ 11 мая 2018

Я хочу дать определенное значение 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 ()

1 Ответ

0 голосов
/ 11 мая 2018

Ваша вторая попытка близка:

repeat,
  readinput(Input),
  (process(Input); write('WRONG') ),
  (Input = [bye| _] ),!.

Полагаю, process потерпит неудачу, если ввод будет неприемлемым, и в противном случае будет успешным. Просто убедитесь, что вы не смогли повторить цикл:

repeat,
    readinput(Input),
    (   process(Input)
    ;   write('WRONG'), nl,
        fail
    ),
    Input = [bye| _],
    !.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...