List 附加列表序言
给定列表作为输入(以下面提到的格式),我需要得到一个简单的列表输出,如果给定的输入列表为空,那么谓词应该返回一个空列表 给定输入List 附加列表序言,list,prolog,List,Prolog,给定列表作为输入(以下面提到的格式),我需要得到一个简单的列表输出,如果给定的输入列表为空,那么谓词应该返回一个空列表 给定输入 [[[a,b],[c]],[[d,e]],[[g,h],[j,k]],[[h,k,l,l]]] 我需要得到输出 [[a,b],[c],[d,e],[g,h],[j,k],[h,k,l,l]] 我在执行递归时遇到问题 我试过的代码如下 function([],X):-append([],X,X). function([Head|Tail],X):-
[[[a,b],[c]],[[d,e]],[[g,h],[j,k]],[[h,k,l,l]]]
我需要得到输出
[[a,b],[c],[d,e],[g,h],[j,k],[h,k,l,l]]
我在执行递归时遇到问题
我试过的代码如下
function([],X):-append([],X,X).
function([Head|Tail],X):-
first(Tail,A),
append(Head,A,X),
removehead(Tail,C),
function(C,X).
如果谓词首先返回列表的第一个元素,removehead将删除列表的第一个元素。您在共享的代码中进行了公平的尝试。以下是您需要改进的地方:
function
描述了这样一个事实,即每当第一个参数是列表时,该谓词都有一个解决方案。这通常在文档中完成,例如%!函数(+Nested:list,-Denested:list)是det.
append([],X,X)
如果X
是一个列表,那么它在这里是多余的first/2
,removeehead/2
?如果要实例化列表的第一个元素,还可以将子句head参数写成[head,a | C]
。然后,您也不需要明确地从Tail
中移除头部%! denest(+Nested:list, -Denested:list) is det.
denest([], []).
denest([H|T1], L):-
denest(T1, T2),
append(H, T2, L).
运行示例:
?- denest([[[a,b],[c]],[[d,e]],[[g,h],[j,k]],[[h,k,l,l]]], L).
L = [[a, b], [c], [d, e], [g, h], [j, k], [h, k, l|...]].
希望这有帮助 给定列表作为输入(以上面提到的格式),我需要得到一个简单的列表输出,如果给定的输入列表是空的,那么谓词应该返回一个空列表。把这个问题放到问题中!感谢您的输入,我不知道如何编写您提到的head参数,这促使我首先编写/2并删除head/2。@sand Prolog是一种非常优雅的语言:您在其中编程的时间越长,程序就会越短:-)