序言清单差异例程 [英] Prolog list difference routine

查看:67
本文介绍了序言清单差异例程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

尝试时:

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

我收到此错误:

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

推荐答案

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

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.

这是您需要的吗?

这篇关于序言清单差异例程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆