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

あなたは述語句の定義内に改行を使用することを許可されています。各カンマの後に1文字を入れると読みやすくなります。 – 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)は答えとしてsiまたはnoを期待しています。問題は、入力が無効で、実際には有効でないときにのみ動作を定義することです。つまり、siまたはnoを入力するとルールを満たさずに失敗するだけです。

また、入力が無効な場合は、preguntar_duracionをちょうど読み込んだRtaDuracionで再帰呼び出しします。これは、次のreadの場合、既にRtaDuracionの値を持ち、ユーザーが別のものを入力した場合に失敗することを意味します。そして、いつも同じことを入力すれば、これは永遠に続くでしょう。

あなたはプロローグの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 
    ). 
+0

私は実際には検証をしないことにしました。なぜなら、Prologの - >それ以外の多くの特別な節は使用できず、入力を検証することを義務づけられていなかったからです(これは大学の練習でした)。とにかく、あなたの答えは確かに正確でした。ありがとう。 –

関連する問題