Prolog中毕业成绩的计算

时间:2014-04-15 17:16:36

标签: prolog

我的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

1 个答案:

答案 0 :(得分:3)

正如@lurker所指出的,逻辑AND(,)和逻辑OR(;)是具有不同优先级的运算符。表达式并不一定会像你想象的那样绑定。表达式如何

a , b ; c , d

绑定?是吗......

  • 并且具有比OR更高的优先级:(a,b) ; (c,d)
  • OR的优先级高于AND: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 .