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

问题描述

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

我有简单的分类,但我不确定如何设置实际的谓词。

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

非常感谢任何帮助!

解决方法

最好将“数字”与其“类”的代表联系起来,在这种情况下,它是原子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 >= 50,N =< 100.
classify(N,big)     :- must_be(number,N > 100.

我们也知道对于N,这三种情况中只有一种可以成功,所以我们可以告诉Prolog,如果已经成功,就没有必要尝试另一种选择,通过使用{{1 }} 在前两个子句的末尾(你也可以将它添加到第三个子句,但它在那里没有做任何事情,它是最后一个子句):

!

所以:

classify(N,N < 50,!.
classify(N,N =< 100,N > 100.