【发布时间】:2020-11-20 17:03:35
【问题描述】:
我在序言中编写了一个谓词,其中我给出了两个参数listsFromL(X,B)。 X 将是一个包含该列表中的列表的列表,B 将是一个包含来自X 的列表的新列表。
因此,例如,如果我调用listsFromL([1,2,[d,a]],X).,则返回值为B = [[d,a]].,如果我向X 添加更多列表,我将得到一个更长的列表,其中列表为X。
我该怎么做?
【问题讨论】:
我在序言中编写了一个谓词,其中我给出了两个参数listsFromL(X,B)。 X 将是一个包含该列表中的列表的列表,B 将是一个包含来自X 的列表的新列表。
因此,例如,如果我调用listsFromL([1,2,[d,a]],X).,则返回值为B = [[d,a]].,如果我向X 添加更多列表,我将得到一个更长的列表,其中列表为X。
我该怎么做?
【问题讨论】:
listsFromList([],[]) .
listsFromList([HEAD|SOURCEs],[HEAD|TARGETs])
:-
is_list(HEAD) ,
listsFromList(SOURCEs,TARGETs)
.
listsFromList([HEAD|SOURCEs],TARGETs)
:-
\+ is_list(HEAD) ,
listsFromList(SOURCEs,TARGETs)
.
/*
?- listsFromList([1,2,3,4,[a,b]],X).
X = [[a, b]] ;
false.
?- listsFromList([1,[a,b],2,[c,d],3],X).
X = [[a, b], [c, d]] ;
false.
?- listsFromList([],X).
X = [].
?-
*/
【讨论】:
[HEAD|TARGETs] 。这意味着HEAD 被添加到输出列表中。第三个子句仅包含 TARGETs 。这意味着HEAD 没有添加到输出列表中。
你需要:
现在您只需将这两个乐高积木放在一起即可。
listsFromList(Stuff,OnlyLists) :-
include(is_list,Stuff,OnlyLists).
所以:
?- listsFromList([],OLs).
OLs = [].
?- listsFromList([a,b,c],OLs).
OLs = [].
?- listsFromList([a,b,[x,y],c],OLs).
OLs = [[x, y]].
【讨论】:
listsFromList(SOURCEs,TARGETs)
:-
phrase(listsFromList_,SOURCEs,TARGETs)
.
listsFromList_,[] --> \+ [_] .
listsFromList_,[ITEM] --> [ITEM] , { is_list(ITEM) } , listsFromList_ .
listsFromList_,[] --> [ITEM] , { \+ is_list(ITEM) } , listsFromList_ .
/*
?- listsFromList([1,2,3,4,[a,b]],X).
X = [[a, b]] ;
false.
?- listsFromList([1,2,[b,c],3,4,[a,b]],X).
X = [[b, c], [a, b]] ;
false.
?- listsFromList([],X).
X = [] ;
false.
?-
*/
【讨论】: