В чем разница между списком с чем-либо ([_]) и чем-либо (_) - PullRequest
6 голосов
/ 19 декабря 2011

Я пытался выполнить следующее, если у меня есть два списка, L1 и L2, я хотел, чтобы результат (R) был «вычитанием» L2 из L1.

Пример:

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

R = [1]

Я был в состоянии сделать это, но я не могу сказать, в чем разница между _ и [_].

Если я сделаю это:

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

Это работает, если я делаю это, это дает мне ложь:

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

Я бы предположил, что список, содержащий все, что [_] должно работать, поскольку L2 всегда будет списком.

Ответы [ 2 ]

8 голосов
/ 19 декабря 2011

На самом деле, _ соответствует только одной переменной и только одной переменной.Здесь вы хотите, чтобы оно совпадало с 2, 3, 4, 5 (четыре переменные).Не можетМожет соответствовать только [2, 3, 4, 5] (список).Вам нужно было бы написать [_|_] так, чтобы голова и хвост совпали ([2|[3, 4, 5]])

или [_, _, _, _, _, _, ...] с числом _, которое является точным количеством элементов в вашем списке, такчто каждый отдельный элемент правильно сопоставляется с анонимной переменной.

Основное, что нужно помнить, это то, что _ является просто нормальной переменной.Если у вас возникают проблемы с запоминанием, просто явные имена, такие как _Head или _Accumulator, так что вы понимаете, когда пишете свой код, что то, чем вы манипулируете, на самом деле является переменной, только вас это не волнует (запуск переменной_ не будет выдавать предупреждение об одноэлементной переменной, по крайней мере, в swi-pl, поэтому их можно использовать вместо _ для лучшей общей ясности).

Редактировать : еще один способ сказать, что в вашем названии вы думаете, _ - это что-то.Но все может быть ничем, и все может быть многими вещами._ может быть только одно.Вот почему это не работает:]

4 голосов
/ 19 декабря 2011

_ - это что угодно ... foo, [1,2], bar (42, foo [2,3,7]) и т. Д.
[_] - список, содержащий ровно один элемент, который может бытьчто-нибудь

в вашем примере, если L2 имеет более одного элемента (или является пустым списком), тогда он не будет совпадать с [_]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...