谓词中的谓词,如果M和N的差异大于X,则为真

时间:2017-10-21 10:00:37

标签: prolog successor-arithmetics

首先,我是prolog的新手,我正在尝试写一个谓词长度(M,X,N),如果M与N的差异超过X,则为真。

我编写了以下测试用例,如果M(= dec.5)和N(= dec.2)的差异大于X(= dec.2),则该测试用例为真。在这种情况下确实如此,因为5和2的差值为3,大于2:

?- length(s(s(s(s(s(0))))), s(s(0)), s(s(0))).
   true .

我知道prolog以递归方式工作所以我想知道我是否可以像C语言一样构造具有条件的谓词(例如<,>),或者如果在prolog中有另一种方法可以做到这一点。很抱歉这个简单的问题,但我刚开始使用prolog。

3 个答案:

答案 0 :(得分:3)

您可以构建更多或更少的谓词。例如:

$('#ES_name').append('(TEST)');

同样地:

greater_than(s(_), 0).
greater_than(s(X), s(Y)) :-
    greater_than(X, Y).

如果你想找到绝对差异,你可以这样做:

less_than(0, s(_)).
less_than(s(X), s(Y)) :-
    less_than(X, Y).

这些概念应该有助于启动一些有关如何解决其余问题的想法。

答案 1 :(得分:3)

这个答案跟随@ lurker的精确答案并通过利用提高辅助谓词abs_diff/3的确定性 first argument clause indexing

介绍x_y_dist/3

x_y_dist(0, Y, Y).
x_y_dist(s(X), Y, Z) :-
   y_sx_dist(Y, X, Z).

y_sx_dist(0, X, s(X)).
y_sx_dist(s(Y), X, Z) :-
   x_y_dist(X, Y, Z).

示例查询:

?- x_y_dist(X, Y, s(s(0))).                             % |X-Y| = 2
(  X =           0     , Y =         s(s(0))            % |0-2| = 2
;  X =       s(s(0))   , Y =             0              % |2-0| = 2
;  X =         s(0)    , Y =       s(s(s(0)))           % |1-3| = 2
;  X =     s(s(s(0)))  , Y =           s(0)             % |3-1| = 2
;  X =       s(s(0))   , Y =     s(s(s(s(0))))          % |2-4| = 2
;  X =   s(s(s(s(0)))) , Y =         s(s(0))            % |4-2| = 2
;  X =     s(s(s(0)))  , Y =   s(s(s(s(s(0)))))         % |3-5| = 2
;  X = s(s(s(s(s(0))))), Y =       s(s(s(0)))           % |5-3| = 2
;  X =   s(s(s(s(0)))) , Y = s(s(s(s(s(s(0))))))        % |4-6| = 2
;  .........
)

答案 2 :(得分:0)

试试这个:

?- length(s(s(s(s(s(0))))), s(s(0)), s(s(0))).

length(s(_),0,0).
length(s(M),s(X),s(N)) :- length(M,X,N).

请记住,Prolog的谓词不会返回值 - 因此他们不会返回truefalse。他们要么成功要么他们不成功。解释器只是告诉你程序是否成功。