【问题标题】:Get all Prefixes of a List, including [] in Prolog获取列表的所有前缀,包括 Prolog 中的 []
【发布时间】:2018-04-26 00:11:35
【问题描述】:

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

myPrefix([],[]). 

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

我查看了很多其他答案,但那些只是处理从列表中取出第一个元素,而不是列出所有可能的前缀。任何关于如何从这里开始的建议或关于列表操作功能的头部和尾部如何工作的更多解释都值得赞赏。

【问题讨论】:

    标签: prolog


    【解决方案1】:

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

    myPrefix(_, []).
    myPrefix([H|T], [H|NT]):-
      myPrefix(T, NT).
    

    第一个子句忽略第一个参数并将第二个参数与空列表统一。

    第二个子句将第一个参数列表的头部作为第二个参数的头部,并递归调用自身。

    因此,实际上,第二个子句根据需要一个接一个地接受多个项目,而第一个子句去掉了尾部。

    【讨论】:

    • 那么 suffix 函数在本质上做了同样的事情,但是在第一次调用 prefix 函数时反转了两个参数?因为那样它将从每个元素中取出“第一个”元素,从技术上讲,这将是列表的最后一个元素。
    • @math:不,对于后缀过程,您可以将第一个子句更改为mySuffix(L, L).,将第二个子句更改为mySuffix([_|T], NL):- mySuffix(T, NL).
    • 是否有任何合适的资源可以更好地了解列表操作?我对它的工作方式感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 2018-11-05
    • 2010-10-08
    • 1970-01-01
    • 2021-06-13
    • 2022-10-30
    相关资源
    最近更新 更多