我的prolog程序中有错误我尝试在WinProlog中计算CGPA,代码如下:
grade(X).
start:-
( write('please enter ur cgpa'), read(X), X > 0 , X < 2,
write('ur cgpa is poor'), write(X)
; X >= 2, X < 3,
write('ur cgpa is good')
; X >= 3,
write('ur cgpa is excellent')
).
// comments
// %cgpa(X,good):-grade(X) , X>=2 , X<3.
// %cgpa(X,good):-grade(X) , X>=3 , write("your grade is excelent").
// is there anything missing, please help me
答案 0 :(得分:3)
正如@lurker所指出的,逻辑AND(,
)和逻辑OR(;
)是具有不同优先级的运算符。表达式并不一定会像你想象的那样绑定。表达式如何
a , b ; c , d
绑定?是吗......
(a,b) ; (c,d)
a , (b;c) , d
( ( (a,b) ; c ) , d )
( a , ( b ; (c,d)))
如果您不确定,请用括号清除绑定(但不要过度使用)。
此外,Prolog的一个方面是,替代方案通常更好地指定为谓词的单个子句,而不是使用逻辑OR(;
)运算符。像这样的东西
evaluate_grade( X , poor ) :- X >= 0.0 , X < 2.0 .
evaluate_grade( X , good ) :- X >= 2.0 , X < 3.0 .
evaluate_grade( X , excellent ) :- X >= 3.0 .
比
更容易调试,扩展,修改和理解( X>0 , X<2 ,
write('ur cgpa is poor') , write(X) ;
X>=2 , X<3,
write('ur cgpa is good') ;
X>=3 ,
write('ur cgpa is excellent')
)
采用这种方法也有助于引导你进入Single Responsibility Principle - 一种说法,事情应该只做一件简单的事情。
因此,您可以尝试将问题分解为更小的部分,每个部分都做一件事。像这样:
start:-
read_grade(X) ,
evaluate_grade(X,R),
write('Your CGPA is ') ,
write(R) ,
nl
.
read_grade(X) :-
write('please enter your CGPA: ') ,
read(X),
number(X)
.
evaluate_grade( X , poor ) :- X >= 0.0 , X < 2.0 .
evaluate_grade( X , good ) :- X >= 2.0 , X < 3.0 .
evaluate_grade( X , excellent ) :- X >= 3.0 .