Prolog - 修改并返回列表

时间:2016-11-09 22:12:25

标签: list prolog return

我想定义一个带有列表的谓词,在列表中添加一个元素,让我们说数字“1”,然后返回列表。

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

我面向对象的思维模式让我向解释器询问:? - append(X,5,X)。 ,所以它需要列表X,为它添加5,并返回“新X”,但我知道这不是统一的工作原理,所以我的思想有点小故障。

任何人都可以试着解释一下这样的事情是如何实现的吗?

2 个答案:

答案 0 :(得分:1)

你已经非常接近解决方案,所以我只重新说明你已经开始意识到的:

首先,您无法修改纯Prolog中的列表。

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

因此,“将数字1添加到列表中”是两个列表之间的 relation ,它们可能如下所示:

list_with_one(Ls, [1|Ls]).

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

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

所以,你需要做的就是根据列表之间的关系来思考:一个没有元素,以及它与的不同列表的关系>元素。

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

特别注意append(X, 5, X) 无法容纳:首先,append/3列表和{{之间的关系1}} 不是列表。其次,假设您编写了例如5,那么这将是真的如果那里有一个列表append(Xs, [5], Xs),如果元素Xs附加到{{ 1}},结果列表将再次为5。祝你找到这样一个列表...请注意,通过让变量名以 s 结尾来表示列表的命名约定。

将此归咎于“面向对象的思维模式”也有点短暂,因为您也可以在Prolog中使用面向对象的编程。

答案 1 :(得分:0)

虽然无法修改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|_]