[英]Recursion through a list in Prolog
我试图在Prolog中反转一个列表。 当我用['item1', 'item2']
调用它时,它正常工作,但是当我用['item1'|'item2']
调用时,它['item1'|'item2']
。 我是Prolog的初学者,但是我认为这两种表示法在本质上可以互换吗?
这是我正在使用的代码:
reverse_list([], Acc, Acc).
reverse_list([Head|Tail], Acc, Reversed) :-
reverse_list(Tail, [Head|Acc], Reversed).
reverse_list(List,Reversed) :-
reverse_list(List,[],Reversed).
问题是在列表尾部进行递归调用时
当我用list ['item1', 'item2']
调用它时,调试器显示它可以正常工作,并以尾部为['item2']
进行递归调用。
当我用['item1'|'item2']
调用时,调试器显示它尝试使用'item2'进行递归调用,但失败了,大概是因为它不是列表。
我读到,当使用[Head|Tail]
,Tail始终是列表,但是看起来情况并非如此。
您能否解释一下Prolog如何处理这些列表,以及为什么这两种表示列表的方式不能互换? 您能解释一下如何使此代码起作用吗?
谢谢!
列表的尾部是列表。 例如:
| ?- [1,2,3] = [Head| Tail].
Head = 1
Tail = [2,3]
yes
您用作参数['item1'|'item2']
的复合词不是列表:
| ?- ['item1'|'item2'] = [Head| Tail].
Head = item1
Tail = item2
yes
您需要改为编写[item1|[item2]]
,与[item1,item2]
:
| ?- [item1|[item2]] = [item1,item2].
yes
由于列表符号是语法糖,因此可以使用标准的write_canonical/1
谓词来检查列表结构:
| ?- write_canonical([1,2,3]).
'.'(1,'.'(2,'.'(3,[])))
yes
| ?- write_canonical([item1, item2]).
'.'(item1,'.'(item2,[]))
yes
| ?- write_canonical([item1| item2]).
'.'(item1,item2)
yes
当调用reverse_list([item1|[item2]], Reversed)
,目标在第一次递归调用时失败,因为您获得了reverse_list(item2, ..., ...)
,这与任何一个标题都不统一reverse_list/3
谓词的子句,因此无法得到证明。 因此,谓词定义没有错。 只是对列表表示的一种误解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.