无法在PROLOG中验证输入

时间:2017-10-17 20:50:05

标签: validation input prolog

我制作了专家系统,但我有一些错误。它可以向用户询问一些问题,他们回答“是”或“否”(西班牙语中的“si”,“no”)。问题是当我验证答案时,程序返回“false”。 以下是包含错误的代码部分:

:- dynamic respondeSi/1.
:- dynamic respondeNo/1.
:- dynamic seriesSugeridas/2.

abrirBase :-
   retractall(seriesSugeridas(_,_)),
   retractall(respondeSi(_)),
   retractall(respondeNo(_)),
   consult('TP4.txt').  %modificar directorio

inicio:- 
   abrirBase, writeln('¡Bienvenido! Vamos a ver qué serie podemos recomendarte...'), 
   filtrar_series.

filtrar_series:- 
   preguntar_duracion(RtaDuracion),
   preguntar_serie_terminada(RtaTermino),
   preguntar_serie_nueva(RtaSerieNueva), 
   obtener_series(RtaDuracion, RtaTermino, RtaSerieNueva), 
   consultar_caracteristicas.

preguntar_duracion(RtaDuracion):-  
   write('¿Tenés bastante tiempo libre? Respuesta (si|no): '),  
   read(RtaDuracion),  RtaDuracion \= si, RtaDuracion \= no, 
   writeln('Respuesta inválida, conteste nuevamente.'), 
   preguntar_duracion(RtaDuracion).  
   %%AFTER INPUTTING THE ANSWER ONCE MORE HERE, 
     IT RETURNS "false" AND ENDS THE PROGRAM

preguntar_serie_terminada(RtaTermino):-  
   write('¿Buscás una serie que aún no haya terminado? Respuesta (si|no): '),  
   read(RtaTermino),  RtaTermino \= si, RtaTermino \= no, 
   writeln('Respuesta inválida, conteste nuevamente.'),  
   preguntar_serie_terminada(RtaTermino).

preguntar_serie_nueva(RtaSerieNueva):-  
   write('¿Buscás una serie nueva? Respuesta (si|no): '), 
   read(RtaSerieNueva),  RtaSerieNueva \= si, RtaSerieNueva \= no, 
   writeln('Respuesta inválida, conteste nuevamente.'),  
   preguntar_serie_nueva(RtaSerieNueva).

为什么会这样?感谢

更新:它总是会返回false。我很确定假的是RtaDuracion \ = si的输出。

1 个答案:

答案 0 :(得分:2)

我真的不会说西班牙语,也无法测试您的代码,但从我看到的问题出发在preguntar_duracion(RtaDuracion)

preguntar_duracion(RtaDuracion):-  
   write('¿Tenés bastante tiempo libre? Respuesta (si|no): '),  
   read(RtaDuracion),  RtaDuracion \= si, RtaDuracion \= no, 
   writeln('Respuesta inválida, conteste nuevamente.'), 
   preguntar_duracion(RtaDuracion).  

根据我的理解,read(RtaDuracion)期望sino作为答案。问题是您只在输入无效时定义行为,而不是在实际有效时定义行为。这意味着,当您输入sino时,它将无法满足规则并且只会失败。

此外,如果输入无效,则您使用刚刚阅读的preguntar_duracion递归调用RtaDuracion。这意味着对于下一个read,它将具有RtaDuracion的值,因此如果用户输入其他内容,则会失败。如果你总是输入相同的东西,这将永远持续下去。

你可以使用Prolog的if -> then ; else结构来纠正这个谓词:

preguntar_duracion(RtaDuracion):-  
   write('¿Tenés bastante tiempo libre? Respuesta (si|no): '),
   read(TempRtaDuracion),
   (   TempRtaDuracion \= si,
       TempRtaDuracion \= no
   ->  writeln('Respuesta inválida, conteste nuevamente.'), 
       preguntar_duracion(RtaDuracion)
   ;   RtaDuracion = TempRtaDuracion
   ).