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