无法在PROLOG中验证输入
我制作了专家系统,但我有一些错误。它的作品询问用户一些问题,他们回答“是”或“否”(西班牙文中的'si','no')。问题是,当我验证答案时,程序返回“false”。 这里的代码有错误的部分:无法在PROLOG中验证输入
:- 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的输出。
我真的不说西班牙语,不能测试你的代码,但是从我看到的问题在于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)
预计si
或no
的答案。问题在于,您只能在输入无效时定义行为,而不是实际有效时的行为。这意味着,当您输入si
或no
时,它不会满足规则并且只是失败。
此外,如果输入无效,则您可以递归调用preguntar_duracion
并读取刚刚阅读的RtaDuracion
。这意味着对于下一个read
,它已经具有RtaDuracion
的值,并且因此如果用户输入其他内容则会失败。如果你总是输入相同的东西,这将永远持续下去。
你可以纠正这个谓词是这样,使用if -> then ; else
结构的Prolog:
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
).
我实际上决定不做任何验证,因为我们不允许使用,如果 - >然后也没有许多其他特殊条款的序言,并没有义务验证输入(这是一个大学的练习)。无论如何,你的答案肯定是准确的。谢谢。 –
你被允许谓语从句定义中使用换行符。在每个逗号后加上一个将有助于提高可读性。 – lurker