我想在Prolog中创建一个谓词,以检查列表A是否是列表B的子列表。此外,我不希望我的程序将空列表视为另一个列表的子集。
例如:included_list([1,4],[1,2,3,4,5])应返回true。included_list([2,3],[1,2,3,4,5])应返回true。included_list([1,6],[1,2,3,4,5])应返回false。included_list([], [1,2,3,4,5])应返回false,并且如此等等...
因此,到目前为止,我已经编写了以下代码:
但是上面的代码似乎是错误的,因为在某些情况下它会抛出true,而不是抛出wrong。我希望在呈现以下屏幕截图后能够清楚地表述:
例如:included_list([1,4],[1,2,3,4,5])应返回true。included_list([2,3],[1,2,3,4,5])应返回true。included_list([1,6],[1,2,3,4,5])应返回false。included_list([], [1,2,3,4,5])应返回false,并且如此等等...
因此,到目前为止,我已经编写了以下代码:
member(X,[X|Tail]).
member(X,[Head|Tail]):- member(X,Tail).
included_list([X],_).
included_list([Head|Tail],List):- member(Head,List), included_list(Tail,List).
但是上面的代码似乎是错误的,因为在某些情况下它会抛出true,而不是抛出wrong。我希望在呈现以下屏幕截图后能够清楚地表述:
正如您可能已经注意到的那样,第五(5)句话给出了true,而不是wrong。也就是说,当我写一个形如:
included_list([x,y],[w,x,v,z])。
其中只有x被包含在第二个列表中(而不是y),程序仍然返回true(这是错误的)。
通常,如果第一个列表的第一个参数被包含在第二个列表中,那么无论前者的其余部分是否被包含在后者中,该程序都会返回true。
在任何其他情况下,该程序将给出正确的结果(true或false)。
我做错了什么?
期待您的回答!
提前感谢您!
member/2
是ISO标准,因此您无需自己定义它。而Prolog会抛出异常,而不是true或"wrong"。 - Daniel Lyonsincluded_list/2
对于任何一个单项列表都是成立的。相反,应该说included_list([], _)
,这样就能正常工作了。 - Daniel Lyonsforall(member(X, Subset), member(X, List))
来解决它,但我非常烦恼它没有生成! - Daniel Lyonsfindall
的作用吗?forall
旨在用于副作用,它不创建绑定的事实是有意设计的。 - user1812457findall/3
时遇到了困难。你知道怎么做吗? - Daniel Lyonsfindall(X, ( member(X, Subset), member(X, List) ), Subset)
或者foreach(member(X, Subset), member(X, List))
。但我真的不会使用任何一个。 - user1812457