Имя объекта как переменная в Logtalk - PullRequest
0 голосов
/ 17 декабря 2018

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

X :: name (john).

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

object_id :: name (X).

1 Ответ

0 голосов
/ 17 декабря 2018

Конструкция управления отправкой сообщений ::/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.

...