列表与任何内容([_])和任何内容(_)之间有什么区别

Tru*_*ufa 6 list prolog

我试图完成以下操作,如果我有两个列表,L1和L2,我希望结果(R)是来自L1的L2的"减法".

例:

L1 = [1,2,3]
L2 = [2,3,4,5]

R = [1]
Run Code Online (Sandbox Code Playgroud)

我能够做到这一点,但我不知道_和之间有什么区别[_].

如果我这样做:

diferencia([],_,[]).
diferencia([X|Tail],L2,R):-
    member(X,L2),
    diferencia(Tail,L2,R).
diferencia([X|Tail],L2,[X|R]):-
    not(member(X,L2)),
    diferencia(Tail,L2,R).
Run Code Online (Sandbox Code Playgroud)

它有效,如果我这样做,它会给我错误:

diferencia([],[_],[]).
diferencia([X|Tail],L2,R):-
    member(X,L2),
    diferencia(Tail,L2,R).
diferencia([X|Tail],L2,[X|R]):-
    not(member(X,L2)),
    diferencia(Tail,L2,R).
Run Code Online (Sandbox Code Playgroud)

我会假设一个包含任何内容的列表[_]应该可以工作,因为L2将始终是一个列表.

m09*_*m09 8

实际上,只_匹配一个变量和一个变量.在这里,你希望它匹配2, 3, 4, 5(四个变量).它不能.它只能匹配[2, 3, 4, 5](列表).你必须写,[_|_]以便头部和尾部匹配([2|[3, 4, 5]])

或者[_, _, _, _, _, _, ...]使用数量_作为列表中的确切项目数,以便每个元素都与匿名变量正确匹配.

要记住的基本事情是,这_只是一个普通的变量.如果你有麻烦记住它,只是明确的名称,如_Head_Accumulator,这样你就当你写你的代码意识到,你操纵的事情其实是一个变量,只有你不关心它(可变开始用_不会产生单个变量警告,至少在swi-pl中,因此它们可用而不是_为了更好的整体清晰度).

编辑:另一种说法是,在你的标题中,你认为_是什么.但任何东西都可能一无所有,任何东西都可以是很多东西._只能是一件事.这就是为什么它不起作用的原因:]