如何将元素附加到Prolog中的列表中?

No *_*lar 16 list append prolog in-place difference-lists

如果我在Prolog中有一个列表,例如X = [1,2,3,4],如何将元素5添加到列表的末尾以使X = [1,2,3,4,5]?

append函数需要两个列表,即追加(A,B,C)以获得A和B连接到列表C.

我可以用临时列表Y = [1,2,3,4]和Z = [5]来做这个,然后做一个追加(Y,Z,X),但我不喜欢有一个临时列表.

通常的免责声明适用于此 - 这不是家庭作业,我只是在学习Prolog.

S.L*_*ica 7

正如其他人所指出的那样,你将陷入性能问题.
但就像练习一样,我决定尝试创建一个谓词,可以将一个元素附加到列表的末尾,而不使用append.

% add_tail(+List,+Element,-List)
% Add the given element to the end of the list, without using the "append" predicate.
add_tail([],X,[X]).
add_tail([H|T],X,[H|L]):-add_tail(T,X,L).
Run Code Online (Sandbox Code Playgroud)

我建议您只使用该append功能,作为内置功能,它可能比手动制作的任何东西都快.

  • 用本杰明·富兰克林(Benjamin Franklin)的风格:“ *那些放弃基本正确性而购买一些临时演出的人,既不应该正确也不应该表现。” (3认同)

mnd*_*rix 6

Prolog中的变量只能分配一次.只要X具有值[1,2,3,4],它就永远不会有另一个值.像你提到的那样,一个临时变量和追加/ 3就是这样做的方法.

话虽如此,你可以做一个可能不推荐的技巧.如果X = [1,2,3,4,Y]那么你可以做Y = 5而X现在有你想要的值.我相信这种技术被称为差异列表.

  • 为了使用差异列表,您需要跟踪列表中的"洞"(在这种情况下,它的尾部).即差异列表总是一对两个术语,一个是带有"洞"的列表,另一个是"洞"本身."洞"本身就是一个逻辑变量.表示该对的传统方式是使用内置的中缀运算符. (2认同)