使用 Prolog 将字母绑定到给定的整数,例如在班级成绩中

Use Prolog to bind a letter to a given integer such as in class grades

提问人:Matt 提问时间:7/22/2023 最后编辑:Will NessMatt 更新时间:7/23/2023 访问量:69

问:

我需要使用 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

Prolog 语法-错误 约束 bind function-call

评论

0赞 gusbro 7/22/2023
您在查询末尾误读了一个点 (),在 .1 () 之前误报了一个 0。此外,规则的头部应为 f 或 。.evaluate_grade(0.1,F).'F'
0赞 Matt 7/22/2023
好的,谢谢。但我只想输入一个数字并得到一个字母,例如:evaluate_grade(1)->F

答:

1赞 Nicholas Carey 7/22/2023 #1
  1. 您的查询缺少终止句点,因此在语法上不正确。evaluate_grade(.1,F)

  2. .1不是 Prolog 语言中的数字文本:数字文本需要整数分量。

    0.1是数字文字,而语法不正确 — 是谓词,被定义为中缀运算符。左边没有要绑定的内容,因此解析失败。.1../2.

  3. 您的谓词:

    evaluate_grade( X ,   F   ) :- X \>= 0.0 , X \< 2.0 . 
    

    将给你另一个关于单例变量的警告:任何以大写字母开头的标识符都是变量。你的谓词会成功,但由于没有任何东西是统一的,它将保持未绑定。F

  4. \是否定运算符,所以是一种笨拙的说法,也是一种笨拙的说法。\>=<\<>=

如果将谓词更改为以下内容:

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/2evaluate_grade(1)

评论

0赞 Matt 8/1/2023
这太棒了。谢谢。如果输入的不是数字,例如:evaluate_grade( blahblah , G ) ,则错误消息怎么办?
0赞 brebs 7/22/2023 #2

可能的方法:

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.