问题描述
目前正在尝试使用谓词分类(+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.
非常感谢任何帮助!
解决方法
最好将“数字”与其“类”的代表联系起来,在这种情况下,它是原子small
、medium
、big
之一。这符合练习的要求:
% 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.