наиболее подходящим переписан на мой взгляд, было бы:
bar([H|_], Item) :- call(H, Item).
call/n
еще не являются частью основного стандарта ISO, но они могут becom e в ближайшем будущем (*). Многие системы Prolog уже поддерживают их.
Существует одна причина, почему call/n
должно быть более предпочтительным, чем простой (=..)/2
и functor/3
+ arg/3
решений. Решение call/n
способно обрабатывать затворы (**).
С простым решением (=..)/2
и functor/3
+ arg/3
можно вызвать bar/2
только с атомами в первом списке аргументов. Например:
p1(1).
p2(2).
?- bar([p1, p2], 1).
Yes
?- bar([p1, p2], 2).
Yes
?- bar([p1, p2], 3).
No
С закрытием мы не ограничены атомами, и мы можем сэкономить некоторое усилие кодирования. Например, мы можем сделать следующие непосредственно:
?- bar([=(1), =(2)], 1).
Yes
?- bar([=(1), =(2)], 2).
Yes
?- bar([=(1), =(2)], 3).
No
С наилучшими пожеланиями
(*)
Проект технических опечаток 2
http://www.complang.tuwien.ac.at/ulrich/iso-prolog/dtc2#call
(**)
Кто изобрел это ?: call/n
Предикаты
http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/naish.html
+1 за вопрос, как переписать без univ. Кстати, существуют функции предикатов ISO/3 и arg/3, которые могли бы выполнять эту работу в некоторых случаях и должны быть предпочтительными, но я не уверен, что они всегда могут быть использованы. – Kaarel
@ Kaarel, +1. Обновлен мой ответ. –