На мой взгляд, наиболее подходящей перепиской будет:
bar( [H|_], Item ) :- call(H, Item).
call/n
еще не являются частью основного стандарта ISO, но они могут стать в ближайшем будущем (*).Многие системы 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