2016-02-27 62 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 
相關問題