Что [] и [_] означают в Прологе - PullRequest
1 голос
/ 01 июня 2019

Я считаю, что [] означает принятие пустых списков, в то время как [_] принятие непустого списка, который может иметь что-либо. Но тогда в каком-то контексте, например, произнесите функцию:

f([]).
f[_]).
f([x|y]):-dostuff.

Разве [x | y] и [_] оба не будут вызваны, поскольку они по сути означают одно и то же?

1 Ответ

2 голосов
/ 01 июня 2019

В Прологе каждый представляет списки в виде связанных списков .Связанный список имеет два «шаблона»:

  1. пустой список []
  2. "минусы" [H|T] с H и T параметрами с H головой списка (первый элемент) и T хвостомсписка (список с оставшимися элементами).

Таким образом, мы можем представить список без элементов как [], с одним элементом как [H1|[]], сдва элемента, такие как [H1|[H2|[]]] и т. д.

Приведенные выше обозначения немного многословны, для списков можно использовать синтаксический sugar.Например, [H1, H2] эквивалентно [H1|[H2|[]]], аналогично [H1,H2|T] эквивалентно [H1|[H2|T]].

Таким образом, [_] в вашем коде является синтаксическим сахаром для [_|[]].Это означает, что это одноэлементный список (список с точно одним элементом _), и мы не заботимся об этом значении списка, пока он объединяетс этим шаблоном.

Но тогда в некотором контексте, например, скажите функцию.

f/1 здесь не функция, этопредикат .Здесь это означает, что предикат f/1 удовлетворяется для пустого списка, для списка с одним элементом независимо от того, что это за элемент, и для списка [X|Y] (я предполагаю, что это идентификаторы в верхнем регистре, поскольку в противном случае он выполняется толькоесли голова является константой x, а хвост является константой y, что означает, что на самом деле это не список).

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