Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 在子列表中查找最大间隔(这些子列表有2个元素)_Prolog - Fatal编程技术网

Prolog 在子列表中查找最大间隔(这些子列表有2个元素)

Prolog 在子列表中查找最大间隔(这些子列表有2个元素),prolog,Prolog,在这个练习中,我得到一个子列表,比如[[X1,Y1],[X2,Y2]…],它们代表一个区间(Xi-Yi),我想返回一个具有最大区间的列表(它可以是多个区间) 这就是我到目前为止得到的。 我看不出我做错了什么,但当我试着跑最大的间隔([[1,2],[5,7],[6,10],[12,15]],L)时。我得到的是真,后面是假,而不是[6,10] biggest_interval([H|T],Answer):- biggest_interval(H,T,-1,Answer). biggest_inte

在这个练习中,我得到一个子列表,比如[[X1,Y1],[X2,Y2]…],它们代表一个区间(Xi-Yi),我想返回一个具有最大区间的列表(它可以是多个区间)

这就是我到目前为止得到的。 我看不出我做错了什么,但当我试着跑最大的间隔([[1,2],[5,7],[6,10],[12,15]],L)时。我得到的是真,后面是假,而不是[6,10]

biggest_interval([H|T],Answer):-
biggest_interval(H,T,-1,Answer).

biggest_interval([],_,_,_).
biggest_interval(_,[],_,_).

biggest_interval([X,Y],[H|T],Biggest,Answer):-
Z is Y-X,
Z =:= Biggest,
append(Answer,[X,Y],L),
!,
biggest_interval(H,T,Biggest,L).
biggest_interval([X,Y],[H|T],Biggest,Answer):-
Z is Y-X,
(
    Z > Biggest -> append([],[X,Y],L),
    biggest_interval(H,T,Z,L);
    true 
),
biggest_interval(H,T,Biggest,Answer).

代码的问题之一是谓词
最大间隔/4
没有收集“基本情况”中的答案(它只停止递归过程)

一种可能的解决办法是:

biggest_interval(ListOfLists, Answer) :-
    biggest_interval(ListOfLists, -inf, [], Biggest),
    reverse(Biggest, Answer).   % if order of the pairs is important!


biggest_interval([], _, Answer, Answer) :- !.       % collect Answer!

biggest_interval([[X,Y]|Lists], Max, Acc, Answer) :-
    Z is Y-X,
    (   Z = Max ->  biggest_interval(Lists, Max, [[X,Y]|Acc], Answer)
    ;   Z > Max ->  biggest_interval(Lists,  Z,  [[X,Y]],     Answer)
    ;               biggest_interval(Lists, Max, Acc,         Answer) ).
以下是一些例子:

?- biggest_interval([[1,2],[5,7],[6,10],[12,15]],L).
L = [[6, 10]].

?- biggest_interval([[1,20],[5,7],[6,10],[12,15]],L).
L = [[1, 20]].

?- biggest_interval([[1,2],[5,7],[6,10],[12,15],[3,10]],L).
L = [[3, 10]].

?- biggest_interval([[1,2],[5,7],[6,10],[12,15],[8,12]],L).
L = [[6, 10], [8, 12]].

代码的问题之一是谓词
最大间隔/4
没有收集“基本情况”中的答案(它只停止递归过程)

一种可能的解决办法是:

biggest_interval(ListOfLists, Answer) :-
    biggest_interval(ListOfLists, -inf, [], Biggest),
    reverse(Biggest, Answer).   % if order of the pairs is important!


biggest_interval([], _, Answer, Answer) :- !.       % collect Answer!

biggest_interval([[X,Y]|Lists], Max, Acc, Answer) :-
    Z is Y-X,
    (   Z = Max ->  biggest_interval(Lists, Max, [[X,Y]|Acc], Answer)
    ;   Z > Max ->  biggest_interval(Lists,  Z,  [[X,Y]],     Answer)
    ;               biggest_interval(Lists, Max, Acc,         Answer) ).
以下是一些例子:

?- biggest_interval([[1,2],[5,7],[6,10],[12,15]],L).
L = [[6, 10]].

?- biggest_interval([[1,20],[5,7],[6,10],[12,15]],L).
L = [[1, 20]].

?- biggest_interval([[1,2],[5,7],[6,10],[12,15],[3,10]],L).
L = [[3, 10]].

?- biggest_interval([[1,2],[5,7],[6,10],[12,15],[8,12]],L).
L = [[6, 10], [8, 12]].

下面是另一种方法,使用Functional设计:

:- use_module(library(lambda)).

biggest_interval([[H1, H2]|T], Out) :-
    D1 is H2 - H1,
    foldl(\X^Y^Z^(X = [A,B],
                  D is B - A,
                  Y = [Delta, L],
                  (   Delta > D
                  ->  Z = Y
                  ;   (   Delta = D
                      ->  append(L, [X], NL),
                          Z = [Delta, NL]
                      ;   Z = [D, [X]]))), T, [D1, [[H1,H2]]], [_, Out]).
例如:

?- biggest_interval([[1,2],[5,7],[6,10],[12,15]],L).
L = [[6, 10]].

?- biggest_interval([[1,2],[5,7],[6,10],[12,15],[8,12]],L).
L = [[6, 10], [8, 12]].

下面是另一种方法,使用Functional设计:

:- use_module(library(lambda)).

biggest_interval([[H1, H2]|T], Out) :-
    D1 is H2 - H1,
    foldl(\X^Y^Z^(X = [A,B],
                  D is B - A,
                  Y = [Delta, L],
                  (   Delta > D
                  ->  Z = Y
                  ;   (   Delta = D
                      ->  append(L, [X], NL),
                          Z = [Delta, NL]
                      ;   Z = [D, [X]]))), T, [D1, [[H1,H2]]], [_, Out]).
例如:

?- biggest_interval([[1,2],[5,7],[6,10],[12,15]],L).
L = [[6, 10]].

?- biggest_interval([[1,2],[5,7],[6,10],[12,15],[8,12]],L).
L = [[6, 10], [8, 12]].