获取列表的所有前缀,包括Prolog中的[]

获取列表的所有前缀,包括Prolog中的[],prolog,Prolog,我是Prolog新手,希望通过自己编写前缀函数来开始学习[H | T]的功能。prefix函数将所有可能的前缀返回到列表中,例如L=[a,b,c]将是[],[a],[a,b]和[a,b,c]。我对我自己的Prolog函数如何能够返回这么多不同的解决方案感到困惑。我让它拆分列表的头和尾,并将头附加到我的新列表中,这将是返回的不同前缀。这就是我到目前为止所拥有的,但我认为我过于简单化了,并且不知道如何递归地调用它来获得所有不同的可能性 myPrefix([],[]). myPrefix([H|T

我是Prolog新手,希望通过自己编写前缀函数来开始学习[H | T]的功能。prefix函数将所有可能的前缀返回到列表中,例如L=[a,b,c]将是[],[a],[a,b]和[a,b,c]。我对我自己的Prolog函数如何能够返回这么多不同的解决方案感到困惑。我让它拆分列表的头和尾,并将头附加到我的新列表中,这将是返回的不同前缀。这就是我到目前为止所拥有的,但我认为我过于简单化了,并且不知道如何递归地调用它来获得所有不同的可能性

myPrefix([],[]). 
myPrefix([H|T],List):-myPrefix(T[H|List])。


我看了很多其他答案,但这些答案只涉及从列表中删除第一个元素,而不是列出所有可能的前缀。对于如何从这里开始的任何建议,或者关于这个列表首尾操作功能如何工作的更多解释,我们将不胜感激

假设实例化的第一个参数确实是一个正确的列表,那么应该这样做:

myPrefix(_, []).
myPrefix([H|T], [H|NT]):-
  myPrefix(T, NT).
第一个子句忽略第一个参数,并将第二个参数与空列表统一起来

第二个子句取第一个参数列表的开头,将其作为第二个参数的开头,并递归地调用自身


因此,实际上,第二个子句根据需要一个接一个地取尽可能多的项,而第一个子句去掉了尾部。

假设第一个参数如果实例化的确实是一个正确的列表,那么应该这样做:

myPrefix(_, []).
myPrefix([H|T], [H|NT]):-
  myPrefix(T, NT).
第一个子句忽略第一个参数,并将第二个参数与空列表统一起来

第二个子句取第一个参数列表的开头,将其作为第二个参数的开头,并递归地调用自身


因此,实际上,第二个子句根据需要一个接一个地取尽可能多的项,而第一个子句去掉了尾部。

那么后缀函数本质上做了相同的事情,但在对prefix函数的第一次调用中反转了两个参数?因为这样它将从每个元素中去掉“first”元素,从技术上讲,这是列表中的最后一个元素。@数学:否,对于后缀过程,您将第一个子句更改为
mySuffix(L,L)。
第二个子句更改为
mySuffix([| T],NL):-mySuffix(T,NL).
是否有合适的资源可以更好地了解列表操作?我对它的工作方式感到困惑。那么后缀函数本质上做了相同的事情,但是在对前缀函数的第一次调用中反转了两个参数?因为这样它将从每个元素中去掉“first”元素,从技术上讲,这是列表中的最后一个元素。@数学:否,对于后缀过程,您将第一个子句更改为
mySuffix(L,L)。
第二个子句更改为
mySuffix([| T],NL):-mySuffix(T,NL).
是否有合适的资源可以更好地了解列表操作?我对它的工作方式感到困惑。