我正在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.
您可以看到每次我分配一个新变量以计算总和。 它有效,但我感觉不舒服。
有没有人有任何建议我可以使用?
答案 0 :(得分:2)
Prolog变量不可分配
你是对的。但这个想法不是“模仿”命令式编程。实际上变量不可分配的事实应该“强迫”你用更多的逻辑编程方式思考。
例如,您不需要变量来跟踪总和。您只需将问题的结果存储在变量X1
,X2
和X3
中,然后在程序中稍后总结。
所以我建议 checkSymptom/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
起初我发现变量无法分配怪异。但后来我意识到这有助于防止人们头疼。以上更具说明性和明确地说明了你在做什么。