переменная используется только один раз - PullRequest
1 голос
/ 18 августа 2010

Я использую древний Турбо Пролог, так как он включен в наш учебный план. Почему эта программа не работает?

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. Разве параметр не передает вызов по ссылке? Когда я передаю Fe в symptoms значение должно быть скопировано в Fe, и когда я сравниваю его в гипотезе, оно должно работать соответствующим образом. = оператор в Turbo Prolog работает очень странно. Когда он не связан ни с одной переменной, оператор a = 3 назначит 3 для a, а когда a уже содержит значение a = 5, проверит, равно ли значение a 5 или нет.

Пожалуйста, помогите мне, почему программа не работает?

Заранее спасибо:)

1 Ответ

2 голосов
/ 22 августа 2010

Проблема не в вашем предикате symptoms/3, они свяжут (объединят) свой третий аргумент с тем, что дает response/1. Проблема в том, что эти значения никогда не передаются в вашу hypothesis/2 процедуру в go/0, поэтому они никогда не используются для создания гипотезы. В Prolog нет глобальных переменных, поэтому вам нужно явно передавать все значения, хотя вы можете хранить вещи в базе данных, которые могут легко вызвать проблемы, если вы не будете осторожны.

Это означает, что в hypothesis/2 вы не тестируете значения Fe, Ra, He и т. Д., А связываете локальные переменные с одинаковыми именами. Вот почему вы получаете предупреждения о том, что на переменные ссылаются только один раз, вы связываете их, но никогда не используете их. Помните, что они локальные, все переменные являются локальными по отношению к предложению, в котором они встречаются.

Все это относится к стандартному прологу, я никогда не использовал Turbo Prolog.

...