1

我正在使用古老的 Turbo Prolog,因为它包含在我们的课程中。为什么这个程序不起作用?

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并且当我在假设中比较它时它应该相应地工作。=Turbo Prolog 中的运算符的工作方式非常奇怪。当它没有绑定到任何变量时,该语句a = 3会将 3 分配给 a,当 a 已经包含一个值时,a = 5将检查 a 的值是否为 5。

请帮助我为什么程序不起作用?

提前致谢 :)

4

1 回答 1

2

问题不在于您的symptoms/3谓词,它们会将其第三个参数绑定(统一)到response/1给出的内容。问题是这些值永远不会传递到您的hypothesis/2过程中,go/0因此它们永远不会用于尝试生成假设。Prolog 没有全局变量,因此您必须显式传递所有值,尽管您可以将内容保存在数据库中,如果您不小心,很容易导致问题。

这意味着hypothesis/2您不是在测试, , 等的值Fe,而是绑定具有相同名称的局部变量。这也是为什么您会收到变量只被引用一次的警告,您绑定它们但从不使用它们。记住它们是局部的,所有变量对于它们出现的子句都是局部的。RaHe

所有这些都适用于标准 prolog,我从未使用过 Turbo Prolog。

于 2010-08-22T18:16:27.120 回答