我是Prolog的新手,想通过尝试自己编写前缀函数来开始学习[H | T]的功能。前缀函数将所有可能的前缀返回到列表,例如对于L = [a,b,c]将是[],[a],[a,b]和[a,b,c]。我对自己的Prolog功能如何能够返回这么多不同的解决方案感到困惑。我将它拆分为列表的头部和尾部,并将头部附加到我的新列表中,该列表将返回不同的前缀。这就是我到目前为止所做的,但我认为我过于简单化,并且不知道如何以递归方式调用它以获得所有不同的可能性。
myPrefix([],[]).
myPrefix([H|T],List) :- myPrefix(T, [H|List]).
我查看了很多其他答案,但这些只是处理从列表中获取第一个元素,而不是列出所有可能的前缀。任何关于如何从这里开始的建议或关于列表操作功能的这个头部和尾部如何工作的更多解释都是值得赞赏的。
答案 0 :(得分:1)
假设实例化的第一个参数确实是一个正确的列表,那么应该这样做:
myPrefix(_, []).
myPrefix([H|T], [H|NT]):-
myPrefix(T, NT).
第一个子句忽略第一个参数,并将第二个参数与空列表统一起来。
第二个子句取第一个参数列表的头部并将其作为第二个参数的头部,并以递归方式调用自身。
因此,实际上,第二个子句会逐个采用所需数量的项目,第一个子句会删除尾部。