我正在尝试编写一个程序,该程序将两个列表作为输入并检查适当的子集。我开始:
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).