【问题标题】:Prolog - Modifying and returning listProlog - 修改和返回列表
【发布时间】:2017-03-23 20:22:12
【问题描述】:

我想定义一个谓词,它接受一个列表,将一个元素添加到列表中,比如说数字“1”,然后返回列表。

我发现我可以使用 append/3 将元素添加到列表中,但我想在另一个谓词中使用,因此我希望它返回“我修改的列表”。

我的面向对象思维告诉我要向解释器询问类似的问题:?-append(X,5,X)。 ,所以它需要列表 X,向其中添加 5,然后返回“新 X”,但我知道这不是统一的工作方式,所以我的脑子有点小故障。

谁能解释一下这样的事情是如何实现的?

【问题讨论】:

    标签: list prolog return


    【解决方案1】:

    您已经非常接近解决方案,所以我只重新表述您已经开始感觉到的内容:

    首先,您不能修改纯 Prolog 中的列表。

    相反,您应该考虑实体之间的关系。在您的情况下,请考虑列表之间的关系

    因此,“向列表添加数字 1”是两个列表之间的关系,它可能如下所示:

    list_with_one(Ls, [1|Ls]).
    

    请注意,这适用于所有方向!你可以用它来:

    • 生成答案
    • 测试特殊情况
    • “反转”方向等。

    因此,在您的情况下,您需要做的就是考虑 列表之间的关系:一个没有元素,以及它与另一个列表的关系如何 元素。

    显然,这两个列表将由不同的变量不同的参数表示。

    特别注意append(X, 5, X) 不能成立:首先,append/3lists 之间的关系,5不是列表。其次,假设您写了例如append(Xs, [5], Xs),那么这将是真的if那里有一个列表Xs,如果元素5被附加到Xs,结果列表将再次成为Xs。祝你好运找到这样的列表...还要注意通过让变量名称以 s 结尾来表示列表的命名约定。

    将这归咎于您的“面向对象的心态”也有点不足,因为您也可以在 Prolog 中进行面向对象的编程。

    【讨论】:

      【解决方案2】:

      虽然 Prolog 中的列表不能修改,但可以在a list with an unspecified length 的末尾添加元素。通过这种方式,可以将项目“附加”到列表中,而无需创建另一个列表:

      :- initialization(main).
      
      append_to_list(List,Item) :-
          append_to_list(List,Item,0).
      
      append_to_list(List,Item,Index) :-
          % using SWI-Prolog's nth0 predicate
          (nth0(Index,List,Check_Item),
          var(Check_Item),
          nth0(Index,List,Item));
          (Next_Index is Index+1,
          append_to_list(List,Item,Next_Index)).
      
      main :-
          A = [1,2,3|_],
          append_to_list(A,4),
          append_to_list(A,7),
          writeln(A).
      

      在本例中,A 变为 [1,2,3,4,7|_]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 2014-09-21
        相关资源
        最近更新 更多