我制作了专家系统,但我有一些错误。它可以向用户询问一些问题,他们回答“是”或“否”(西班牙语中的“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的输出。
答案 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)
期望si
或no
作为答案。问题是您只在输入无效时定义行为,而不是在实际有效时定义行为。这意味着,当您输入si
或no
时,它将无法满足规则并且只会失败。
此外,如果输入无效,则您使用刚刚阅读的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
).