Конструкция управления отправкой сообщений ::/2
действительно требует связанного первого аргумента во время вызова.Но вы можете перечислить существующие объекты, используя встроенный предикат current_object/1
:
| ?- current_object(Person), Person::name(john).
...
Однако это решение также может привести к ошибкам, поскольку мы будем перечислять все объекты путем обратного отслеживания ине все они поймут сообщение name/1
.Таким образом, лучшим решением является перечисление только тех объектов, которые понимают сообщение name/1
.Предполагая, что все объекты, представляющие человека, реализуют (напрямую или через наследование) person_protocol
, мы можем использовать встроенный предикат conforms_to_protocol/2
:
| ?- conforms_to_protocol(Person, person_protocol),
Person::name(john).
...
Подробнее см. https://logtalk.org/manuals/refman/predicates/conforms_to_protocol_2_3.html.