我想定义谓词,其中需要一个列表,将一个元素添加到列表中,让我们说数字“1”,然后返回列表。序言 - 修改和返回列表
我发现我可以使用append/3将元素添加到列表中,但我想在另一个谓词中使用,因此我希望它返回“我的修改列表”。
我的面向对象的思维方式告诉我要求解释器如下所示:?-append(X,5,X)。 ,所以它需要列表X,增加5,并返回“新的X”,但我知道这不是统一的工作方式,所以我的思想有点不对劲。
任何人都可以请尝试解释这样的事情可以实现吗?
我想定义谓词,其中需要一个列表,将一个元素添加到列表中,让我们说数字“1”,然后返回列表。序言 - 修改和返回列表
我发现我可以使用append/3将元素添加到列表中,但我想在另一个谓词中使用,因此我希望它返回“我的修改列表”。
我的面向对象的思维方式告诉我要求解释器如下所示:?-append(X,5,X)。 ,所以它需要列表X,增加5,并返回“新的X”,但我知道这不是统一的工作方式,所以我的思想有点不对劲。
任何人都可以请尝试解释这样的事情可以实现吗?
您已经是非常接近的解决方案,所以我只改一下你开始什么已经感觉到:
首先,你不能修改纯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中进行面向对象的编程,所以在您的“面向对象的思维模式”中指责这一点也有点短。
尽管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|_]
。