Prolog列表差异例程

发布于 2024-08-07 00:09:02 字数 463 浏览 2 评论 0原文

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

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

尝试时:

?- difference([1,2],[],D).

我收到此错误:

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

I am trying to implement a list difference routine in prolog.
For some reason the following fails:

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

When trying:

?- difference([1,2],[],D).

I get this error:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

您的用法 A1 是 [X|A] 不正确。谓词is仅用于算术。
顺便说一句,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.

这是您需要的吗?

Your usage A1 is [X|A] is incorrect. Predicate is is used only for arithmetics.
Btw, SWI-Prolog has built-in subtract predicate:

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.

Is this what you need?

一抹微笑 2024-08-14 00:09:02
minus([H|T1],L2,[H|L3]):-
    not(member(H,L2)),
    minus(T1,L2,L3).
minus([H|T1],L2,L3):-
    member(H,L2),
    minus(T1,L2,L3).
minus([],_,[]). 

minus([1,2,3,4,3], [1,3], L).

output: L=[2,4]
minus([H|T1],L2,[H|L3]):-
    not(member(H,L2)),
    minus(T1,L2,L3).
minus([H|T1],L2,L3):-
    member(H,L2),
    minus(T1,L2,L3).
minus([],_,[]). 

minus([1,2,3,4,3], [1,3], L).

output: L=[2,4]
糖果控 2024-08-14 00:09:02

使用 find all 解决方案变得显而易见:

difference(Xs,Ys,D) :- 
  findall(X,(member(X,Xs),not(member(X,Ys))),D).

Using find all the solution becomes obvious:

difference(Xs,Ys,D) :- 
  findall(X,(member(X,Xs),not(member(X,Ys))),D).
染墨丶若流云 2024-08-14 00:09:02
always (subtructLists(List, [Head|Rest], Result): -
       ( 
          delete_element(Head, List, Subtructed)
        , !
        , subtructLists(Subtructed, Rest, Result)
       ) ; (
          subtructLists(List, Rest, Result)
       )
).

always (subtructLists(List, [], List)).

always( delete_element(X, [X|Tail], Tail)).

always( delete_element(X, [Y|Tail1], [Y|Tail2]): -
        delete_element(X, Tail1, Tail2)
).
always (subtructLists(List, [Head|Rest], Result): -
       ( 
          delete_element(Head, List, Subtructed)
        , !
        , subtructLists(Subtructed, Rest, Result)
       ) ; (
          subtructLists(List, Rest, Result)
       )
).

always (subtructLists(List, [], List)).

always( delete_element(X, [X|Tail], Tail)).

always( delete_element(X, [Y|Tail1], [Y|Tail2]): -
        delete_element(X, Tail1, Tail2)
).
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文