首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检查两个列表整数是否大于或等于2?

如何检查两个列表整数是否大于或等于2?
EN

Stack Overflow用户
提问于 2016-02-27 18:14:23
回答 2查看 265关注 0票数 2

给定两个排序列表XsYs,如何确保Xs中的任何XYs中的任何Y之间的绝对差异至少是两个?

带有预期答案的查询示例:

代码语言:javascript
运行
复制
?- 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

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

编辑:下面是我现在的代码:

代码语言:javascript
运行
复制
difference([], []).
difference([_|_], []).
difference([], [_|_]).
difference(L1, L2) :-
   L1 = [X1|X2],
   L2 = [Y1|_],
   Dif is X1-Y1,
   (-1>Dif|Dif>1),
   difference(X2, L2).
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-28 12:50:26

首先,您可以使当前的代码更整洁、更易于阅读,如下所示:

代码语言:javascript
运行
复制
different([], []).
different([_|_], []).
different([], [_|_]).
different([X|Xs], [Y|Ys]) :-
    abs(X-Y) >= 2,     % Prolog evaluates arithmetic expressions for compares
    different(Xs, [Y|Ys]).

在本例中,您已经完成了我在注释中提到的递归的一个级别,因为它只检查第一个列表的每个元素和第二个元素的第一个元素。它忽略了第二个列表中的所有其他元素。所以你需要把它进一步分解。您可以创建一个帮助谓词,它将列表中的每个元素与单个值进行比较。然后让您的主谓词用另一个列表中的每个元素调用这个助手谓词。然后,主谓词将类似于:

代码语言:javascript
运行
复制
different([], []).
different([], [_|_]).
different([X|Xs], L) :-
    different_element(X, L),
    different(Xs, L).

那么助手谓词将是:

代码语言:javascript
运行
复制
% 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
EN

Stack Overflow用户

发布于 2016-03-01 16:20:26

在这个答案中,我们使用clpfd实现多功能性和最优(线性)算法复杂度。

代码语言:javascript
运行
复制
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)
   ).

让我们使用gnu-prolog版本1.4.4并运行类似OP建议的查询!

代码语言:javascript
运行
复制
| ?- 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35673516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档