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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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 Prolog中列表的串联_List_Prolog - Fatal编程技术网

List Prolog中列表的串联

List Prolog中列表的串联,list,prolog,List,Prolog,有人能帮我找出这些规则中的错误吗 concat([], List, List). concat([Head|[]], List, [Head|List]). concat([Head|Tail], List, Concat) :- concat(Tail, List, C), concat(Head, C, Concat). 尝试连接两个列表失败: | ?- concat([1,2], [4,7,0], What). no 要按照预期的方式修复代码,只需在最后一个子句中对concat/3的

有人能帮我找出这些规则中的错误吗

concat([], List, List).
concat([Head|[]], List, [Head|List]).
concat([Head|Tail], List, Concat) :- concat(Tail, List, C), concat(Head, C, Concat).
尝试连接两个列表失败:

| ?- concat([1,2], [4,7,0], What).

no

要按照预期的方式修复代码,只需在最后一个子句中对
concat/3
的最后一次调用中将
Head
转换为
[Head]
。问题是您调用谓词时使用
Head
仅作为第一个参数,而不是列表

不过,这里有几个注意事项:

  • [Head |[]]
    相当于
    [Head]
  • 你的算法复杂度很低,n!我相信
  • 如果在第二个子句之后没有插入剪切,则通过调用长度为1的第三个子句(即调用第二个子句,然后通过第三个子句运行第二个子句,等等,无限循环)生成无限选择点
以下是SWI pl的版本,提示您使用良好的prolog递归:

append([], List, List).
append([Head|Tail], List, [Head|Rest]) :-
    append(Tail, List, Rest).

如果您想学习如何正确使用递归,可以在最近的文章或教程中找到其他资源。

可以使用append

concatenate(List1, List2, Result):-
   append(List1, List2, Result).

希望这有帮助。

以下是两个列表之间的连接规则:

concat([],L2,L2). concat([Head|Tail],L2,[Head|L3]) :- concat(Tail,L2,L3). 

实现非常简单。 串联只是在第一个列表的末尾追加第二个列表。 继续添加,直到第一个列表中的元素用完为止。现在将第二个列表添加到其中

ap([],L,L).
ap([H|T],L,[H|Z]):- ap(T,L,Z).
输出


谢谢你的帮助。还有一个问题:是否有可能看到prolog如何解释程序?例如,堆栈跟踪可以帮助查看问题。是的,键入
trace.
。您将进入跟踪模式。要保留它,请键入
notrace
。您将处于调试模式。要离开调试模式,请键入
nodebug.
,您将回到正常模式!
?-ap([1,2,3],[a,b,c],List).
  List=[1,2,3,a,b,c]

?-ap([1,2,3],[a,b],List).
  List=[1,2,3,a,b]

?-ap([1,2],[a,b,c],List).
  List([1,2,a,b,c])

?-ap([],[],List).
  List=[]