Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog中毕业成绩的计算_Prolog - Fatal编程技术网

Prolog中毕业成绩的计算

Prolog中毕业成绩的计算,prolog,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 &

我的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
等级(X)。
开始:-
(写('请输入ur cgpa'),读(X),X>0,X<2,
写入(“ur cgpa差”),写入(X)
;X>=2,X<3,
写(‘我们的cgpa很好’)
;X>=3,
写(‘我们的cgpa很优秀’)
).
//评论
//%cgpa(X,好):-grade(X),X>=2,X=3,写下(“你的成绩优秀”)。
//有什么东西不见了吗,请帮帮我

正如@Louger所指出的,逻辑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,差):-X>=0.0,X<2.0。 评估等级(X,良好):-X>=2.0,X<3.0。 评估等级(X,优秀):-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')
)
(X>0,X=2,X=3,
写(‘我们的cgpa很优秀’)
)
采用这种方法也有助于引导你进入一个新的领域——一种奇特的说法,即事情应该只做一件简单的事情

因此,您可以尝试将问题分解为更小的部分,每个部分只做一件事。大概是这样的:

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 .
开始:-
读(X)级,,
评估_等级(X,R),
写下(“您的CGPA是”),
写入(R),
nl
.
阅读等级(X):-
写('请输入您的CGPA:'),
读(X),
编号(X)
.
评估等级(X,差):-X>=0.0,X<2.0。
评估等级(X,良好):-X>=2.0,X<3.0。
评估等级(X,优秀):-X>=3.0。

您能描述一下错误吗?试着这样做:在最后一个句号之前放置一个左括号(,和
X>0
,然后放置一个右括号)。逗号的优先级高于
。感谢您的回答。请完整回答问题,但我还有一个问题。。。当我运行程序时,一切正常,但我在解决方案后显示“是”,因此我可以忽略此“是”吗?或者它默认存在,并且我无法删除?谢谢,我不知道您使用的是什么Prolog实现,但是大多数Prolog解释器在解释器提示下计算谓词时,在计算完成后,通过编写
true.
false.
来指示计算的成功或失败。回溯(通常是
)将找到替代解决方案,直到解决方案集用尽且评估失败。