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的第三个子句(即调用第二个子句,然后通过第三个子句运行第二个子句,等等,无限循环)生成无限选择点
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=[]