2010-08-18 46 views
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将为a赋值3,并且当已经包含值a = 5将检查a的值是否为5。

请帮助我为什么程序无法正常工作?

感谢提前:)

+1

我对Turbo Prolog没有经验,但是在“正常”序言中,“=”正在做它应该做的事情。 '='不是关于算术评估,而是关于统一,'LHS = RHS'试图统一**'LHS'和'RHS',并根据需要绑定任何变量。 – rvirding 2010-08-21 15:50:37

+0

@rvirding,你是对的统一。但是'='的规则是,如果变量未被绑定,'='将作为赋值运算符,并且如果绑定意味着它包含某个值,那么'='将作为比较运算符。 – TCM 2010-08-22 04:22:14

+0

是的,但是你所描述的**是**统一,或者至少在一个简单的层面上。变量可以在嵌套的术语内。所以用'foo(X)= foo(3)',那么变量'X'将与'3'统一,绑定或匹配。 – rvirding 2010-08-22 18:02:12

回答

2

麻烦的是不是你的symptoms/3断言,他们将结合(统一),他们的第三个参数是什么response/1给出。问题是这些值永远不会传递到go/0中的hypothesis/2过程中,因此它们从来不会用于尝试生成假设。 Prolog没有全局变量,所以你必须明确地传递所有的值,尽管你可以把东西放在数据库中,如果你不小心的话,这些东西很容易引起问题。

这意味着,在hypothesis/2你是不是测试的FeRaHe等的值,但结合当地变量具有相同的名称。这也是为什么你只会被引用一次的变量警告,你绑定它们,但从来没有使用它们。记住它们是本地的,所有变量对它们出现的子句都是本地的。

所有这些都适用于标准序言,我从来没有使用Turbo Prolog。