我有一个函数,它接受两个参数,并比较它们是否是单位形式的自然数,以及第一个参数是否大于第二个!
这是我写的代码,但每次它都会让我"不"。
nat(0).
nat(s(X)) :- nat(X).
sum(X,0,X) :- nat(X).
sum(X,s(Y),s(Z)) :- sum(X,Y,Z).
gr(X,Y) :- nat(s(X)), nat(s(Y)), X>Y.
出了什么问题?一切都在Prolog中。函数是gr()。
首先,您可能想要sum
,而不是这个:
sum(0, Y, Y) :-
nat(Y).
sum(s(X), Y, s(Z)) :-
sum(X, Y, Z).
这样Prolog就可以通过只看第一个参数来识别这两个子句是互斥的。
现在到您的大于:
% gr(X, Y) is true if X is greater than Y
gr(X, Y) :- sm(Y, X).
% sm(X, Y) is true if X is smaller than Y
sm(0, s(Y)) :-
nat(Y).
sm(s(X), s(Y)) :-
sm(X, Y).
为了回答您的实际问题:问题是运算符>
处理整数(如1、0或-19),而不是复合项。运算符@>
会起作用(请参阅您正在使用的实现文档),但我觉得您实际上可能希望对此进行明确说明。