Prolog列表差异例程

The*_*One 8 set-theory list prolog

我正在尝试在prolog中实现列表差异例程.由于某种原因,以下失败:

difference(Xs,Ys,D) :- difference(Xs,Ys,[],D).
difference([],_,A,D) :- D is A, !.
difference([X|Xs],Ys,A,D) :-
  not(member(X,Ys)),
  A1 is [X|A],
  difference(Xs,Ys,A1,D).
Run Code Online (Sandbox Code Playgroud)

尝试时:

?- difference([1,2],[],D).
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

ERROR: '.'/2: Type error: `[]' expected, found `1' ("x" must hold one character)
^  Exception: (10) _L161 is [2|1] ? 
Run Code Online (Sandbox Code Playgroud)

小智 10

您的用法A1是[X | A]不正确.谓语仅用于运算.顺便说一句,SWI-Prolog有内置的减法谓词:

1 ?- subtract([1,2,3,a,b],[2,a],R).
R = [1, 3, b].

2 ?- listing(subtract).
subtract([], _, []) :- !.
subtract([A|C], B, D) :-
        memberchk(A, B), !,
        subtract(C, B, D).
subtract([A|B], C, [A|D]) :-
        subtract(B, C, D).

true.
Run Code Online (Sandbox Code Playgroud)

这是你需要的吗?