2017-10-17 61 views
1

我制作了专家系统,但我有一些错误。它的作品询问用户一些问题,他们回答“是”或“否”(西班牙文中的'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的输出。

+3

你被允许谓语从句定义中使用换行符。在每个逗号后加上一个将有助于提高可读性。 – lurker

回答

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的值,并且因此如果用户输入其他内容则会失败。如果你总是输入相同的东西,这将永远持续下去。

你可以纠正这个谓词是这样,使用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 
    ). 
+0

我实际上决定不做任何验证,因为我们不允许使用,如果 - >然后也没有许多其他特殊条款的序言,并没有义务验证输入(这是一个大学的练习)。无论如何,你的答案肯定是准确的。谢谢。 –