1

カリキュラムに含まれているので、私は古代のターボプロローグを使用しています。このプログラムが機能しないのはなぜですか?

domains
    disease, indication = symbol
    Patient = string
    Fe,Ra,He,Ch,Vo,Ru = char
predicates
    hypothesis(Patient,disease)
    symptom(Patient,indication,char)
    response(char)
    go
clauses


    go:-

        write("What is patient's name?"),
        readln(Patient),

        symptom(Patient,fever,Fe),
        symptom(Patient,rash,Ra),   
        symptom(Patient,head_ache,He),  
        symptom(Patient,chills,Ch), 


        symptom(Patient,runny_nose,Ru),
        symptom(Patient,head_ache,He),  
        symptom(Patient,vomit,Vo),


        hypothesis(Patient,Disease),
        write(Patient," probably has ", Disease , "."),nl.

    go:-
        write("Sorry unable to seem to be diagnose disease"),nl.

    symptom(Patient,Fever,Feedback) :-
        Write("Does " , Patient , " have " , Fever , "(y/n) ?"),
        response(Reply),
        Feedback = Reply.


    hypothesis(Patient, chicken_pox) :-

        Fe = Ra = He = Ch = 'y'.

    hypothesis(Patient, caner) :-
        Ru = Ra = He = Vo = 'y'.

    hypothesis(Patient, measles) :-
        Vo = Ra = Ch = Fe = He = 'y'.

    response(Reply):-
        readchar(Reply),
        write(Reply),nl.

警告変数は、を含むすべての行でのみ使用されますsymtoms。パラメータは参照によって呼び出しを渡しませんか?に渡すFesymptoms、値がコピーされFe、仮説で比較すると、それに応じて機能するはずです。=TurboPrologの演算子は非常に奇妙に機能します。変数にバインドされていない場合、ステートメントa = 3はaに3を割り当て、すでに値が含まれている場合a = 5は、aの値が5であるかどうかを確認します。

プログラムが機能しない理由を教えてください。

前もって感謝します :)

4

1 に答える 1

2

問題はあなたのsymptoms/3述語ではありません、彼らは彼らの3番目の議論をresponse/1与えるものに拘束(統一)します。hypothesis/2問題は、これらの値がプロシージャに渡されるgo/0ことはないため、仮説を生成するために使用されることはないということです。Prologにはグローバル変数がないため、すべての値を明示的に渡す必要がありますが、注意しないと問題を簡単に引き起こす可能性のあるものをデータベースに保持できます。

これは、、、、などの値をhypothesis/2テストするのではなく、同じ名前のローカル変数をバインドすることを意味します。これは、変数が1回だけ参照され、バインドするが使用しないという警告が表示される理由でもあります。それらはローカルであることを忘れないでください。すべての変数は、それらが発生する句に対してローカルです。FeRaHe

これはすべて標準のプロローグに当てはまります。私はTurboPrologを使用したことがありません。

于 2010-08-22T18:16:27.120 に答える