我以前从未在Prolog中写过。我必须提供事实,以便在运行时显示:
?- subset([a,b],[a,c,d,b]).
true.
?-include([],[a,b]).
true.
到目前为止,我已写过:
subset([],_Y).
subset([X|T],Y):- member(X,Y),subset(T,Y).
但是当我写 include([],[a,b])时,包括不起作用。 。它显示了这个:
ERROR: toplevel: Undefined procedure: include/2 (DWIM could not correct goal)
任何帮助将不胜感激。感谢
答案 0 :(得分:3)
您收到错误,因为您没有定义谓词include / 2。您的给定示例看起来像include / 2应该描述与subset / 2相同的关系。因此,您可以将您的定义从subset / 2重命名为include / 2,然后运行查询,或者您可以使用subset / 2来定义include / 2:
include(X,Y) :-
subset(X,Y).
请注意,要使用member / 2,您必须使用库(列表)。但是,在某些Prolog系统(例如SWI)中,此库包含谓词子集/ 2,因此在您查阅源文件时会发出警告:
Warning: ...
Local definition of user:subset/2 overrides weak import from lists
如果你想要实现你自己的subset / 2版本并且没有得到这个警告,你可以重命名你的谓词或不使用库(列表)和实现你的版本的member / 2,例如:
subset([],_Y).
subset([X|T],Y) :-
element_in(X,Y),
subset(T,Y).
element_in(X,[X|_]).
element_in(X,[Y|Ys]) :-
dif(X,Y),
element_in(X,Ys).