提问人:Matt 提问时间:7/22/2023 最后编辑:Will NessMatt 更新时间:7/23/2023 访问量:69
使用 Prolog 将字母绑定到给定的整数,例如在班级成绩中
Use Prolog to bind a letter to a given integer such as in class grades
问:
我需要使用 Prolog 为给定的整数等级值绑定字母等级(>= 90 是 a,>= 80 是 b,依此类推。
我正在尝试编写一个这样的函数:
evaluate_grade( X , F ) :- X \>= 0.0 , X \< 2.0 .
但在查询窗口中:
evaluate_grade(.1,F)
我得到:
Cannot run query due to a syntax error (check query window)
Syntax error: Operator expected
我在这里错过了什么?
我只想输入一个数字,然后得到一个字母,例如:。evaluate_grade(1) -> F
答:
您的查询缺少终止句点,因此在语法上不正确。
evaluate_grade(.1,F)
.1
不是 Prolog 语言中的数字文本:数字文本需要整数分量。0.1
是数字文字,而语法不正确 — 是谓词,被定义为中缀运算符。左边没有要绑定的内容,因此解析失败。.1
.
./2
.
您的谓词:
evaluate_grade( X , F ) :- X \>= 0.0 , X \< 2.0 .
将给你另一个关于单例变量的警告:任何以大写字母开头的标识符都是变量。你的谓词会成功,但由于没有任何东西是统一的,它将保持未绑定。
F
\
是否定运算符,所以是一种笨拙的说法,也是一种笨拙的说法。\>=
<
\<
>=
如果将谓词更改为以下内容:
evaluate_grade( X , f ) :- X >= 0.0 , X < 2.0 .
并查询它:
?- evaluate_grade( 0.1 , G ) .
你会得到
G = f
参观 https://swish.swi-prolog.org/p/NDsZkKSg.pl 的游乐场
关于您的评论:
好的,谢谢。但我只想输入一个数字并得到一个字母,如下所示:
evaluate_grade(1)->F
Prolog 没有函数,也没有返回值。无论您想要“返回”什么,都会作为参数传递。您传入一个未实例化的变量,当证明完成并且控制流返回给您时,该变量将实例化为最小一致性值,这是查询保持所需的。
给定 的定义,查询将失败,因为谓词不存在。如果它这样做了,它只能成功或失败。它没有办法在附加参数中“返回”任何内容,因为您的谓词中没有附加参数。evaluate_grade/2
evaluate_grade(1)
评论
可能的方法:
grade(90, a).
grade(80, b).
grade(70, c).
grade(60, d).
grade(50, e).
grade(40, f).
grade(30, g).
grade(20, h).
grade(10, i).
grade(0, j).
eval_grade(I, G) :-
grade(N, G),
( G == a
-> Inc = 10
; Inc = 9
),
U is N + Inc,
( ground(I)
-> between(N, U, I),
% Prevent backtracking after the 1 solution
!
; between(N, U, I)
).
...它有很好的功能:
% The most general query works
?- eval_grade(I, G).
I = 90,
G = a ;
etc.
% No unwanted choicepoint, if given the score
?- eval_grade(14, G).
G = i.
?- eval_grade(100, G).
G = a.
% If given just the grade, loops through the scores
?- eval_grade(I, e).
I = 50 ;
etc.
上一个:为什么 strtok() 在我的 C 程序中无法正常工作?
下一个:反转图例的顺序
评论
.
evaluate_grade(0.1,F).
'F'