使用序言将数字分类为大、中或小?

Classifying a number as big, medium, or small using prolog?

目前正在尝试使用谓词 classify(+N, ?Classification) 解决我的 class for Prolog 中的问题: 小数在 50 以下,中数在 50 到 100(含)之间,大数在 100 以上。例如,classify(24, X) 应该成功且 X = small。

我有简单的 class说明,但我不确定如何设置实际谓词。

small(X) :- X < 50.
medium(X) :- X >= 50, X =< 100.
big(X) :- X > 100. 

非常感谢任何帮助!

最好将“数字”连接到它的“class”的代表,在本例中是原子smallmediumbig。这符合练习要求:

% classify(+N, ?Classification)

classify(N, small)   :- ...guard...test N for smallness...
classify(N, medium)  :- ...guard...test N for mediumness...
classify(N, big)     :- ...guard...test N for bigness...

“守卫”可以检查 classify/2 是用“N 一个数字”调用的,而不是其他东西,也可能是一个尚未绑定的变量。根据可以省略的情况,否则可以使用像 must_be/2:

这样的谓词

所以我们写:

classify(N, small)   :- must_be(number,N), N < 50.
classify(N, medium)  :- must_be(number,N), N >= 50, N =< 100.
classify(N, big)     :- must_be(number,N), N > 100.

我们还知道,对于 N,三种情况中只有一种可以成功,因此我们可以告诉 Prolog,如果已经成功,则无需尝试替代方案,方法是使用 ! 在前两个子句的末尾(你也可以将它添加到第三个子句,但它在那里什么都不做,它是最后一个子句):

classify(N, small)   :- must_be(number,N), N < 50, !.
classify(N, medium)  :- must_be(number,N), N >= 50, N =< 100, !.
classify(N, big)     :- must_be(number,N), N > 100.

等等:

?- classify(100,How).
How = medium.

?- classify(100,big).
false.

?- classify(100,medium).
true.

?- classify(N,medium).
ERROR: Arguments are not sufficiently instantiated