2

首先,我对 prolog 完全陌生,我正在尝试编写一个谓词长度(M,X,N),如果 M 与 N 的差异大于 X,则该谓词长度(M,X,N)是正确的。

我编写了以下测试用例,如果 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 中是否有另一种方法可以做到这一点。很抱歉这个简单的问题,但我刚从序言开始。

4

3 回答 3

3

您可以为更大或更少构造谓词。例如:

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).

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

abs_diff(0, 0, 0).
abs_diff(s(X), 0, s(X)).
abs_diff(0, s(X), s(X)).
abs_diff(s(X), s(Y), D) :-
    abs_diff(X, Y, D).

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

于 2017-10-21T11:49:34.250 回答
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
;  .........
)
于 2017-10-22T23:01:22.157 回答
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 的谓词不返回值 - 所以它们不返回trueor false。他们要么成功,要么不成功。解释器只是告诉你你的程序是否成功。

于 2017-10-21T10:14:16.490 回答