用Prolog计算和

用Prolog计算和,prolog,sum,Prolog,Sum,我正在用Prolog编写一个专家系统作业,并试图改进我的代码。系统向用户显示问题,每个问题都有一个范围内的答案(总是、经常、很少、从不)。对于每一个问题,我想把值加到最后的总和中。 正如您所知,在Prolog中,变量是不可赋值的,因此我使用下一个技巧: anyDisorder(Res):- Sum is 0, checkSymptom('Do you feel lonely?', Sum, Sum1), checkSymptom('Do you feel sad?', S

我正在用Prolog编写一个专家系统作业,并试图改进我的代码。系统向用户显示问题,每个问题都有一个范围内的答案(总是、经常、很少、从不)。对于每一个问题,我想把值加到最后的总和中。 正如您所知,在Prolog中,变量是不可赋值的,因此我使用下一个技巧:

anyDisorder(Res):-
    Sum is 0,
    checkSymptom('Do you feel lonely?', Sum, Sum1),
    checkSymptom('Do you feel sad?', Sum1, Sum2),
    checkSymptom('Do you wish to be somewhere else?', Sum2, Sum3),
    Res is Sum3.
您可以看到,每次我分配一个新变量以计算总和时。 它很管用,但我觉得不舒服

有人有什么建议我可以用它来代替吗

Prolog变量是不可赋值的

你说得对。但这个想法不是“模仿”命令式编程。事实上,变量是不可赋值的,这应该“迫使”你用一种更具逻辑性的编程方式来思考

例如,您不需要变量来跟踪总和。您只需将问题的结果存储在变量
X1
X2
X3
中,然后在程序中进行汇总即可

因此,我建议让
检查症状/2
只返回值
,然后写入
Res is X1+X2+X3
,作为最后一个陈述:

anyDisorder(Res):-
    checkSymptom('Do you feel lonely?', X1),
    checkSymptom('Do you feel sad?', X2),
    checkSymptom('Do you wish to be somewhere else?', X3),
    Res is X1+X2+X3.
起初我发现变量不能赋值这一事实很奇怪。但后来我意识到这有助于防止人们头痛。以上更具声明性和明确性地显示了您正在做什么

checkSymptom(Query, Outcome) :-
    %% ...
    %% ask the question
    %% set outcome to an integer