2017-10-17 87 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

我實際上決定不做任何驗證,因爲我們不允許使用,如果 - >然後也沒有許多其他特殊條款的序言,並沒有義務驗證輸入(這是一個大學的練習)。無論如何,你的答案肯定是準確的。謝謝。 –