Prolog:子集事实不起作用

时间:2016-04-17 17:33:29

标签: prolog

我以前从未在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)

任何帮助将不胜感激。感谢

1 个答案:

答案 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).