Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
List 序言:获取列表中的每三项并将其附加到新列表中_List_Prolog - Fatal编程技术网

List 序言:获取列表中的每三项并将其附加到新列表中

List 序言:获取列表中的每三项并将其附加到新列表中,list,prolog,List,Prolog,使用Prolog中的以下代码,我成功地从列表中提取了每三项: third([_,_,Z|L], Z). third([_,_,C|L], Y) :- third(L, Y). 但是,我仍然需要将提取的每个项目附加到一个新列表中,并最终创建一个仅包含“每隔三个”项目的列表。 如果有任何提示或帮助,我将不胜感激! 谢谢。这样做怎么样 list_thirds([] , []). list_thirds([_] , []). list_thirds([_,_]

使用Prolog中的以下代码,我成功地从列表中提取了每三项:

third([_,_,Z|L], Z).    
third([_,_,C|L], Y) :-
   third(L, Y).
但是,我仍然需要将提取的每个项目附加到一个新列表中,并最终创建一个仅包含“每隔三个”项目的列表。 如果有任何提示或帮助,我将不胜感激!
谢谢。

这样做怎么样

list_thirds([]        , []).
list_thirds([_]       , []).
list_thirds([_,_]     , []).
list_thirds([_,_,E|Es], [E|Xs]) :-
   list_thirds(Es, Xs).
使用SICStus Prolog 4.3.2的示例查询:

| ?- list_thirds([], Xs).
Xs = [] ? ;
no

| ?- list_thirds([a,b,c], Xs).
Xs = [c] ? ;
no

| ?- list_thirds([a,b,c,d,e,f], Xs).
Xs = [c,f] ? ;
no

| ?- list_thirds([a,b,c,d,e,f,g], Xs).
Xs = [c,f] ? ;
no
去“另一个方向”怎么样

最后,我们看一下从最一般的查询中得到的答案顺序:

| ?- list_thirds(Es, Xs).
Es = []                 , Xs = []      ? ;
Es = [_A]               , Xs = []      ? ;
Es = [_A,_B]            , Xs = []      ? ;
Es = [_A,_B,_C]         , Xs = [_C]    ? ;
Es = [_A,_B,_C,_D]      , Xs = [_C]    ? ;
Es = [_A,_B,_C,_D,_E]   , Xs = [_C]    ? ;
Es = [_A,_B,_C,_D,_E,_F], Xs = [_C,_F] ? ;
...

这样做怎么样

list_thirds([]        , []).
list_thirds([_]       , []).
list_thirds([_,_]     , []).
list_thirds([_,_,E|Es], [E|Xs]) :-
   list_thirds(Es, Xs).
使用SICStus Prolog 4.3.2的示例查询:

| ?- list_thirds([], Xs).
Xs = [] ? ;
no

| ?- list_thirds([a,b,c], Xs).
Xs = [c] ? ;
no

| ?- list_thirds([a,b,c,d,e,f], Xs).
Xs = [c,f] ? ;
no

| ?- list_thirds([a,b,c,d,e,f,g], Xs).
Xs = [c,f] ? ;
no
去“另一个方向”怎么样

最后,我们看一下从最一般的查询中得到的答案顺序:

| ?- list_thirds(Es, Xs).
Es = []                 , Xs = []      ? ;
Es = [_A]               , Xs = []      ? ;
Es = [_A,_B]            , Xs = []      ? ;
Es = [_A,_B,_C]         , Xs = [_C]    ? ;
Es = [_A,_B,_C,_D]      , Xs = [_C]    ? ;
Es = [_A,_B,_C,_D,_E]   , Xs = [_C]    ? ;
Es = [_A,_B,_C,_D,_E,_F], Xs = [_C,_F] ? ;
...
这将有助于:

 bagof(Third,third(List,Third),Result).
这将收集所有项目
Third
,以便
Third
在列表中排名第三;并将它们的列表绑定到
结果

有关bag的更多信息,请参阅。

这将起作用:

 bagof(Third,third(List,Third),Result).
这将收集所有项目
Third
,以便
Third
在列表中排名第三;并将它们的列表绑定到
结果


有关bag的更多信息,请参阅。

使用SWI Prolog和模块lambda.pl,您可以编写

:- use_module(library(lambda)).
third(In, Out) :-
    foldl(\X^Y^Z^(Y=[N,L],
              (   N = 2
              ->  append(L, [X], NL),
              Z = [0,NL]
              ;   N1 is N+1,
              Z = [N1, L])),
          In, [0, []], [_, Out]).
对于相同的查询:

 ?- third([1,2,3,4,5,6,7,8,9,10], Out).
Out = [3, 6, 9].

  ?- third(X, [3,6,9]).
X = [_G103, _G180, 3, _G352, _G438, 6, _G613, _G699, 9] ;
X = [_G103, _G180, 3, _G352, _G438, 6, _G613, _G699, 9|...] .

 ?- third(X, Y).
X = Y, Y = [] ;
X = [_G87231],
Y = [] ;
X = [_G87231, _G87317],
Y = [] ;
X = [_G87231, _G87317, _G87403],
Y = [_G87403] ;
X = [_G87231, _G87317, _G87403, _G87489],
Y = [_G87403] ;
X = [_G87231, _G87317, _G87403, _G87489, _G87575],
Y = [_G87403] ;
X = [_G87231, _G87317, _G87403, _G87489, _G87575, _G87661],
Y = [_G87403, _G87661] .

使用SWI Prolog和模块lambda.pl,您可以编写

:- use_module(library(lambda)).
third(In, Out) :-
    foldl(\X^Y^Z^(Y=[N,L],
              (   N = 2
              ->  append(L, [X], NL),
              Z = [0,NL]
              ;   N1 is N+1,
              Z = [N1, L])),
          In, [0, []], [_, Out]).
对于相同的查询:

 ?- third([1,2,3,4,5,6,7,8,9,10], Out).
Out = [3, 6, 9].

  ?- third(X, [3,6,9]).
X = [_G103, _G180, 3, _G352, _G438, 6, _G613, _G699, 9] ;
X = [_G103, _G180, 3, _G352, _G438, 6, _G613, _G699, 9|...] .

 ?- third(X, Y).
X = Y, Y = [] ;
X = [_G87231],
Y = [] ;
X = [_G87231, _G87317],
Y = [] ;
X = [_G87231, _G87317, _G87403],
Y = [_G87403] ;
X = [_G87231, _G87317, _G87403, _G87489],
Y = [_G87403] ;
X = [_G87231, _G87317, _G87403, _G87489, _G87575],
Y = [_G87403] ;
X = [_G87231, _G87317, _G87403, _G87489, _G87575, _G87661],
Y = [_G87403, _G87661] .

有一种DCG方法也能起作用,类似于@repeat的答案:

thirds([]) --> [].
thirds([]) --> [_].
thirds([]) --> [_,_].
thirds([X|T]) --> [_,_,X], thirds(T).
或者更简洁地说(谢谢@repeat):

召集方式如下:

| ?- phrase(thirds(T), [a,b,c,d,e,f,g,h]).

T = [c,f] ? a
no

| ?- phrase(thirds(T), L).

L = []
T = [] ? ;

L = [_]
T = [] ? ;

L = [_,_]
T = [] ? ;

L = [_,_,A]
T = [A] ? ;

L = [_,_,A,_]
T = [A] ? ;
...

有一种DCG方法也能起作用,类似于@repeat的答案:

thirds([]) --> [].
thirds([]) --> [_].
thirds([]) --> [_,_].
thirds([X|T]) --> [_,_,X], thirds(T).
或者更简洁地说(谢谢@repeat):

召集方式如下:

| ?- phrase(thirds(T), [a,b,c,d,e,f,g,h]).

T = [c,f] ? a
no

| ?- phrase(thirds(T), L).

L = []
T = [] ? ;

L = [_]
T = [] ? ;

L = [_,_]
T = [] ? ;

L = [_,_,A]
T = [A] ? ;

L = [_,_,A,_]
T = [A] ? ;
...


如果列表长度不能被3整除怎么办?他的关系很好。虽然我会使用
\u C
而不是
C
。如果列表长度不能被3整除怎么办?他的关系很好。虽然我会使用
\u C
而不是
C
。在[1,2,3,4,5,6,7,8,9,10]的情况下,它会回答否。我希望给出[3,6,9]。谢谢你的帮助@J.East。请再试一次。现在更好了?在[1,2,3,4,5,6,7,8,9,10]的情况下,它的回答是否。我希望给出[3,6,9]。谢谢你的帮助@J.East。请再试一次。现在好多了?去另一个方向怎么样?现在,
?-Result=[C,F],bagof(Third,Third(List,Third),Result)。
耗尽了全局堆栈--它甚至没有给出一个答案……要解决向另一个方向移动的问题,请尝试:
findnsols(2,Third,Third(List,Third),Result)。
这行吗?我尝试了
?-findnsols(2,第三,第三(列表,第三),Result),false。
但很快就用完了全局堆栈…尝试删除
,false
。删除
,false
,没有帮助,它只会隐藏问题:这个目标不会普遍终止。是否也转到另一个方向?现在,
?-Result=[C,F],bagof(Third,Third(List,Third),Result)。
耗尽了全局堆栈--它甚至没有给出一个答案……要解决向另一个方向移动的问题,请尝试:
findnsols(2,Third,Third(List,Third),Result)。
这行吗?我尝试了
?-findnsols(2,第三,第三(List,Third),Result),false。
但很快就用完了全局堆栈…尝试删除
,false
。删除
,false
没有帮助,它只隐藏了一个问题:这个目标并不是万能的。s(X):如果你喜欢在DCG中使用条,为什么不
thirds([])-->[\u124;是的,这更整洁。谢谢。s(X):如果你喜欢在DCG中使用条形图,为什么不使用三分之一([])-->[]。
?@重复是的,这更整洁。谢谢。