gpt4 book ai didi

prolog - 删除给定列表的成员,它们出现在子列表之后

转载 作者:行者123 更新时间:2023-12-04 06:07:44 25 4
gpt4 key购买 nike

我正在尝试删除 Prolog 中出现在子列表 [z,z,z] 之后的列表的所有成员。
f.ex removeafterZZZ([a,b,c,z,z,z,a], X) -> X = [a,b,c,z,z,z].
我有方法子列表加入 给。

    % first argument is a sublist of the second argument
sublist(Sublist, List):-
join(_List1, List2, List),
join(Sublist,_List3, List2).


% we get the list in third argument by joining lists from first two arguments
join([], L, L).
join([Head | Tail1], List2, [Head | Tail3]):-
join(Tail1, List2, Tail3).

所以我一直在考虑 3 种可能的输入“选项”:

1) []

2) 类似 [a,b,c], [a,b,c,z,z] 的东西,其中输出自动为 == 输入

3) 类似 [a,b,c,z,z,z,a]

所以我想到了3条规则:
removeafterZZZ([],[]).   %for empty lists
removeafterZZZ(List,X) := %for lists with no [z,z,z] sublist
not ( sublist ( [z,z,z], List)) ,
X = List.

removeafterZZZ([H|T], X) := %for lists with sublist [z,z,z]
join(H, X, X), %join the head of list with X
removeafterZZZ(T, X). %call function again with tail

所以这显然不能这样工作,我怎么知道我是否已经将 z,z,z 写入输出列表?我应该使用计数器吗?如何?

最佳答案

如果您被允许使用 append(它是 prolog 提供的标准列表谓词),这里有一个删除后缀的通用方法——

% removeAfterSuff(Original List, Suffix To Remove, Result)
removeAfterSuff(X, [], X) :- !.
removeAfterSuff(X, Y, X) :- \+ sublist(Y,X).
removeAfterSuff(X, Y, Z) :- append(A, B, X), append(Y, _, B), append(A,Y,Z).

它使用了一个剪切,所以它有点难看,但是如果你传入 [],那么谓词 2 会给出一堆结果(是的,是的,红色的剪切,无论如何)。

这是它的工作原理,如果后缀不是列表的成员,则激活选项 2 并且 X 和 Z 相等。否则它会说“存在两个列表,A 和 B,它们可以构成我的原始列表。第二个列表 B,以我的后缀开头,然后包含所有内容(我不在乎那是什么东西)。因为我知道A 是后缀之前的所有内容,那么我的结果是 A 与 Y 连接。”

请注意,这将为您提供列表的多个结果,例如
[a,b,z,z,z,a,b,z,z,z]

编辑添加:如果您对返回结果的空列表没问题,您可以删除第一行
removeAfterSuff([a,b,c], [], Z).
Z = []
Z = [a]
Z = [a,b]
Z = [a,b,c]

关于prolog - 删除给定列表的成员,它们出现在子列表之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8158217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com