作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个程序,该程序将两个列表作为输入并检查适当的子集。我开始于:
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
proper([A],[]).
proper([],[A]).
proper([A|T1],[A|T2) :- member(A,T2), proper(T1,T2).
proper([H1|T1], [H2|T2]) :- \+ member(H1, T2).
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)).
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).
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/
这段代码在 Java 中的等价物是什么?我放了一部分,我对 I/O 部分感兴趣: int fd = open(FILE_NAME, O_WRONLY); int ret = 0; if (fd =
我正在尝试将维度为 d1,d2,d3 的张量 M[a1,a2,a3] reshape 为维度为 d2, d1*d3 的矩阵 M[a2,a1*a3]。我试过 M.reshape(d2,d1*d3) 但是
我是一名优秀的程序员,十分优秀!