2016-02-27 56 views
2

给定两个排序列表XsYs,我如何确保Xs中的任何XYs中的任何Y之间的绝对差值至少为2?如何检查两个列表整数之间的差异是否大于或等于2?

示例查询与期望答案:

?- different([1,2,4],[5,6]). % 5-4 < 2 
false 
?- different([1,4],[2,6]).  % 2-1 < 2 
false 
?- different([1,2,6],[4,8]). % 4-2 >= 2 and 6-4 >= 2 and 8-6 >= 2 
true 
?- different([],[4]). 
true 

我怎样才能得到这个结果?有任何想法吗?谢谢!

编辑:以下是代码我现在有:

difference([], []). 
difference([_|_], []). 
difference([], [_|_]). 
difference(L1, L2) :- 
    L1 = [X1|X2], 
    L2 = [Y1|_], 
    Dif is X1-Y1, 
    (-1>Dif|Dif>1), 
    difference(X2, L2). 
+0

你尝试过什么吗? – lurker

+0

直接的方法是逐个浏览第一个元素,并检查元素是否与第二个元素中的每个元素不同。它可能是两层递归。尝试一些东西,并问一个更具体的问题,你卡在哪里。 – lurker

+0

查看我的编辑,更新了我的代码。 – Gamsh

回答

0

首先,你可以让你当前的代码了很多简洁,更易理解如下:

different([], []). 
different([_|_], []). 
different([], [_|_]). 
different([X|Xs], [Y|Ys]) :- 
    abs(X-Y) >= 2,  % Prolog evaluates arithmetic expressions for compares 
    different(Xs, [Y|Ys]). 

在这情况下,你已经完成了我在我的评论中提到的递归的一个级别,因为它只检查第一个列表中的每个元素,而不是仅针对第二个元素的第一个元素。它忽略了第二个列表中的所有其他元素。所以你需要进一步细分。您可以创建一个帮助谓词,将列表中的每个元素与单个值进行比较。然后让你的主谓词与另一个列表的每个元素调用这个辅助谓词。然后,主谓会是什么样子:

different([], []). 
different([], [_|_]). 
different([X|Xs], L) :- 
    different_element(X, L), 
    different(Xs, L). 

然后辅助谓词是:

% This predicate succeeds if the first argument has the desired difference 
% to each of the elements of the second argument (a list) 
% 
different_element(_, []). 
different_element(X, [Y|Ys]) :- 
    abs(X-Y) >= 2, 
    different_element(X, Ys). 
+0

是的,我正在检查第二个列表中的其他元素。任何方式感谢您的答案。 – Gamsh

1

在这个答案,我们使用同时实现 多功能最优(线性)算法的复杂性。

diff_to_mdist([], _, _). 
diff_to_mdist([_|_], [], _). 
diff_to_mdist([X|Xs], [Y|Ys], D) :- 
    ( X #=< Y-D,   diff_to_mdist(Xs, [Y|Ys], D) 
    ; X #> Y-D, X #>= Y+D, diff_to_mdist([X|Xs], Ys, D) 
    ). 
diff_to_mdist([X0,X1|Xs], [Y0,Y1|Ys], D) :- 
    X0 #> Y0-D, X0 #< Y0+D, 
    ( X0 #< Y0, X0 #=< Y0-D, X1 #>= Y0+D, diff_to_mdist([X0,X1|Xs], [Y1|Ys], D) 
    ; X0 #> Y0, Y0 #=< X0-D, Y1 #>= X0+D, diff_to_mdist([X1|Xs], [Y0,Y1|Ys], D) 
    ). 

让我们使用版本1.4.4并运行OP所建议的查询!

| ?- diff_to_mdist([1,2,4], [5,6], 2). 
no 
| ?- diff_to_mdist([1,4], [2,6], 2). 
no 
| ?- diff_to_mdist([1,2,6], [4,8], 2). 
true ? ; 
no 
| ?- diff_to_mdist([], [4], 2). 
yes 
相关问题