Шаблоны, такие как findall/3
, setof/3
и bagof/3
, представляют собой попытку имитировать правильную количественную оценку с помощью переменных Пролога. В большинстве случаев (и здесь во всех трех случаях) они включают явное копирование этих терминов в шаблоне.
Для maplist/3
такие механизмы не всегда необходимы, поскольку фактическая количественная оценка здесь касается только элементов списков. Как правило, дальнейших изменений не происходит. Вместо использования шаблонов первый аргумент maplist/3
- это неполная цель, которой не хватает двух дополнительных аргументов.
maplist(Goal_2, Xs, Ys).
Если вы настаиваете, вы можете получить именно свою версию шаблона, используя library(lambda)
:
templmaplist(Template1, Template2, Goal_0, Xs, Ys) :-
maplist(\Template1^Template2^Goal_0, Xs, Ys).
(Обратите внимание, что я избегаю называть это maplist/5
, поскольку это уже определено с другим значением)
В общем, я предпочитаю избегать создания «своих собственных шаблонов», поскольку это так легко приводит к недоразумениям (уже между мной и мной): аргументы не являются чисто реляционными аргументами, которых обычно ожидают. Используя вместо этого (\)/1
, локальные переменные несколько лучше обрабатываются и более заметны как особые.
... ах, и есть еще одна веская причина избегать шаблонов: они фактически заставляют вас всегда принимать во внимание какой-то менее чем действительно чистый механизм как копирование. Это означает, что ваша программа может обнаруживать некоторые аномалии относительно. монотонность. Вам действительно нужно вникать в детали.
С другой стороны, без шаблонов, пока не происходит копирование, даже ваши предикаты более высокого порядка будут сохранять монотонность, как прелесть.
person
false
schedule
04.01.2018
maplist/3
действительно есть шаблон. Как это должно повлиять на семантику этого предиката? - person mat   schedule 03.01.2018maplist(+Template1, +Template2, :Goal, ?List1, ?List2)
, например findall / 3. Я не уверен, что вы здесь подразумеваете под семантикой. - person Éamonn Olive   schedule 03.01.2018