В чем разница между этими двумя целями?
foo(A) :- A, !, fail.
foo(A).
foo(A) :- call(A), !, fail.
foo(A).
Кажется, они ведут себя одинаково? Какова цель call/1
и есть ли пример, когда это имеет значение?
В чем разница между этими двумя целями?
foo(A) :- A, !, fail.
foo(A).
foo(A) :- call(A), !, fail.
foo(A).
Кажется, они ведут себя одинаково? Какова цель call/1
и есть ли пример, когда это имеет значение?
Нет никакой разницы в выходном коде WAM, сгенерированном этими фрагментами кода, о чем свидетельствует выдача
gplc -w snippet1.pl
gplc -w snippet2.pl
и проверка сгенерированного файла wbc
(где snippetN.pl
содержит либо образец кода). Так что, похоже, это выбор программиста, какой из них использовать. Может быть полезно использовать call/1
из соображений переносимости.
Однако вспомните о существовании call/N
с N > 1, что полезно, если вы хотите вызвать цель, у которой есть аргументы.
Для любопытных, это сгенерированный файл wam: predicate(foo/1,1,static,private,monofile,global,2).
clause(:-(foo(A),','(A,','(!,fail))),[
allocate(1),
get_variable(y(0),1),
put_atom(foo,1),
put_integer(1,2),
put_atom(true,3),
call(('$call')/4),
cut(y(0)),
fail]).
clause(foo(_),[
proceed]).
Единственное отличие заключается в заголовке предложения, которое в другом фрагменте гласит:
clause(:-(foo(A),','(call(A),','(!,fail))),[
call/1
полезен?
- person kentrid; 19.10.2020
A
, но call(A)
. Так что для меня полезно call/1
, так как я как программист предпочитаю использовать последнее. call/1
также является частью стандарта ISO, поэтому его может обеспечить любой соответствующий процессор. Я не думаю, что просто выпуск A
является стандартом ISO. Я думаю, что более портативно использовать call(A)
, а не просто A
.
- person gusbro; 19.10.2020
call/1
полезен (а не call/N
)?
- person kentrid; 19.10.2020
foo/1
является метапредикатом. Возможно, вы могли бы прочитать о мета-предикатах в документации по используемому вами Прологу (GNU-Prolog?) и сообщить нам, есть ли что-нибудь интересное. - person TA_intern   schedule 20.10.2020