我正在尝试编写一个程序,该程序接受两个列表作为输入并检查是否为正确的子集。我开始使用以下代码:
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/4的第二个子句工作原理的理解上。感谢任何帮助。
编辑:
我意识到我试图确定第一个列表是否是第二个列表的真子集并且第二个列表是第一个列表的真子集。清理了代码以更加准确。
proper([],_).
proper([A|T1],[A|T2) :- member(A,T2), proper(T1,T2).
proper([H1|T1], [H2|T2]) :- \+ member(H1, T2).