2016-11-09 40 views
0

我想定义谓词,其中需要一个列表,将一个元素添加到列表中,让我们说数字“1”,然后返回列表。序言 - 修改和返回列表

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

我的面向对象的思维方式告诉我要求解释器如下所示:?-append(X,5,X)。 ,所以它需要列表X,增加5,并返回“新的X”,但我知道这不是统一的工作方式,所以我的思想有点不对劲。

任何人都可以请尝试解释这样的事情可以实现吗?

回答

1

您已经是非常接近的解决方案,所以我只改一下你开始什么已经感觉到:

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

相反,你应该认为关系实体之间。在你的情况下,认为 列表之间的关系。

所以,“加上1号”的列表是一个关系两者之间的名单,这可能是这样的:

list_with_one(Ls, [1|Ls]). 

注意,这一切方向工作于!你可以用它来:

  • 产生解答
  • 测试特殊情况下
  • “反向” 的方向等

所以,你需要在你的情况做就是根据来考虑 列表之间的关系:一个没有元素,以及这与不同的列表如何关联元素。

很明显,这两个列表将显示不同变量不同论点

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

由于您可以在  Prolog中进行面向对象的编程,所以在您的“面向对象的思维模式”中指责这一点也有点短。

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|_]