我想定义一个带有列表的谓词,在列表中添加一个元素,让我们说数字“1”,然后返回列表。
我发现我可以使用append / 3将元素添加到列表中,但是我想在另一个谓词中使用,因此我希望它返回“我的修改后的列表”。
我面向对象的思维模式让我向解释器询问:? - append(X,5,X)。 ,所以它需要列表X,为它添加5,并返回“新X”,但我知道这不是统一的工作原理,所以我的思想有点小故障。
任何人都可以试着解释一下这样的事情是如何实现的吗?
答案 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|_]
。