gpt4 book ai didi

prolog - 适当的子集 - Prolog

转载 作者:行者123 更新时间:2023-12-04 15:44:55 30 4
gpt4 key购买 nike

我正在尝试编写一个程序,该程序将两个列表作为输入并检查适当的子集。我开始于:

proper([A],[]).
proper([],[A]).
proper([A|T1],[A|T2]) :- proper(T1,T2).

这对于完全相同顺序的输入非常有效。例如:
?- proper([a,b,c],[a,b,c,d]).
Yes

但不适用于以下输入:
?- proper([a,b,c],[b,d,a,c]).
No

在浏览了该网站后,我发现了之前提出的这个问题:

Subset function in prolog

这导致我修改我的代码:
proper([A],[]).
proper([],[A]).
proper([A|T1],[A|T2) :- member(A,T2), proper(T1,T2).
proper([H1|T1], [H2|T2]) :- \+ member(H1, T2).

这适用于子集,但不适用于适当的子集。我认为我的问题是由于我对正确/4 的第二个子句如何工作的理解引起的。非常感谢任何和所有帮助。

编辑:

意识到我试图确定第一个列表是否是第二个列表的适当子集,第二个列表是否是第一个列表的适当子集。清理代码以更精确。
proper([],_).
proper([A|T1],[A|T2) :- member(A,T2), proper(T1,T2).
proper([H1|T1], [H2|T2]) :- \+ member(H1, T2).

最佳答案

如果我理解正确的话,您最后一次尝试中的前两个声明意味着,具有 1 个元素的列表是空列表的真子集(false),而空列表是具有一个元素的列表的真子集(真的);第一个应该是有问题的,因为 proper([1], [])也会成功proper([],[1]) ,但真子集关系是不对称的。

我相信您的第二次尝试没有过滤掉相同子集的原因是您没有声明要求 A 小于 B。

以下是我想出的一些可能的解决方案。我用 smaller_set/2几次以提高清晰度和简洁性。

smaller_set(A, B) :-
length(A, LA),
length(B, LB),
LA < LB.
def_proper_subset/2 try catch 子集的标准定义。
def_proper_subset(A, B) :-
smaller_set(A, B), % if A < B then there's some _e in B that isn't in A.
forall(member(_e, A), member(_e, B)).

一个递归定义的例子,基于删除 A 和 B 的每个匹配元素。它确保 A < B 只有在 A 用完 B 之前的元素时才成功。
rec_proper_subset1([], [_|_]).
rec_proper_subset1([_e|A], B) :-
select(_e, B, C), % C is B with _e removed. Only true if _e is in B.
rec_proper_subset1(A, C).

一旦主谓词已经确保 A < B,这个谓词使用辅助谓词来检查成员资格。
rec_proper_subset2(A, B) :-
smaller_set(A, B),
rec_proper_subset2_(A, B).

rec_proper_subset2_([], _).
rec_proper_subset2_([_e|A], B) :-
member(_e, B),
rec_proper_subset2_(A, B).

编辑:
  • 您需要使用 list_to_set/2 , sort/2 ,或者类似的东西,如果你想确保你的列表没有任何重复的元素。但是这些类型的解决方案也可以用于查找子列表。
  • 我想 def_proper_subset/2是一种蹩脚的解决方案,因为它只会检查A是否是B的子集而不能在A中生成B的子集。另外两个可以思考。

  • (我搞砸了,忘了包括 rec_proper_subset2/2 的地面定义,但我现在已经修复了它)。

    关于prolog - 适当的子集 - Prolog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19558041/

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