Имя объекта как переменная в Logtalk

Возможно ли получить имя объекта как переменную? Я пытаюсь создать базу данных, где каждый объект представляет каждого человека. У меня есть объекты с [имя /1, фамилия /1], но когда я спрашиваю, например,

X:: имя (джон).

это дает мне ошибку. Ofc нет проблем, чтобы получить атом с помощью этого метода:

object_id:: имя (X).

1 ответ

Решение

::/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 для получения подробной информации.

Другие вопросы по тегам