如何在Prolog中编写带条件判断的投资决策decision函数
代码存在的问题
- 语法规则错误:Prolog不支持谓词嵌套定义,你把
saving、income两个谓词的实现直接写在了decision谓词的内部,这属于基础语法错误,代码无法正常运行。 - 变量引用错误:最后一个分支的判断条件写的是
I =< Minsaving,和你要实现的逻辑完全不符,你需要对比的是收入I和最低收入线Minincome,这里属于变量用混。 - 逻辑结构混乱:没有按照你要求的优先级处理分支:存款低于最低值是最高优先级的判断条件,剩下两个分支都要在存款达标的前提下再判断收入,你原来的代码没有做分层判断,用分号拼接的分支逻辑也不符合需求。
- 运算符错误:Prolog的小于等于运算符是
=<,你代码里的=<是HTML转义后的写法,属于格式错误。
修正后的实现
你可以直接用Prolog的条件分支结构实现,不需要额外定义多余谓词,逻辑更清晰:
decision(I, D, S) :- MinIncome is 9000 + 2500 * D, MinSaving is D * 3000, ( S < MinSaving -> write('You should invest your money into savings. ') ; I > MinIncome -> write('You should try to invest in NYSE stock market. ') ; write('You should invest your money into both, saving and stock market. ') ).
如果偏好拆分成多个谓词的写法,也可以用cut(!)控制分支匹配:
decision(I, D, S) :- MinIncome is 9000 + 2500 * D, MinSaving is D * 3000, judge(S, I, MinSaving, MinIncome). judge(S, _, MinSaving, _) :- S < MinSaving, write('You should invest your money into savings. '), !. judge(_, I, _, MinIncome) :- I > MinIncome, write('You should try to invest in NYSE stock market. '), !. judge(_, _, _, _) :- write('You should invest your money into both, saving and stock market. ').
两种写法都完全符合你要求的逻辑:优先判断存款是否达标,不达标直接走存款投资建议;存款达标后判断收入,收入高于最低线建议投股票,否则建议两者都投。
内容的提问来源于stack exchange,提问作者Smit Patel
相关产品推荐
相关产品推荐

