Создание словарей Prolog

Я понимаю, что Prolog не является объектно-ориентированным языком, и после прочтения нескольких сообщений StackOverflow мне не ясно, возможно ли это, но я решил, что все равно спрошу:

Если Customer имеет и имеет только name (атомарную строку) и age (целое число), можно ли попросить Пролог дать несколько примеров словарей Customer, учитывая список возможных name и диапазон age? Фактическое использование будет иметь обширные ограничения на значения словаря.

Например, в идеале я хочу что-то вроде этого

between(18, 60, Customer.age),
member(Customer.name, [jodie, tengyu, adiche, tomoyo, wolfgang]),
Customer = whatisthis{age: What, name: Wot}.

дать мне что-то вроде

Customer = whatisthis{age: 24, name: tomoyo} ;
Customer = whatisthis{age: 55, name: tengyu} ;
...
...

person Zhanwen Chen    schedule 21.05.2019    source источник
comment
Обычно нужно просто заполнить базу данных customer(tomoyo, 24). customer(tengyu, 55)., а затем запросить ее customer(Name, Age).. У SWI есть словари, и всегда есть Logtalk, если вам нужен объектно-ориентированный Prolog.   -  person Daniel Lyons    schedule 21.05.2019
comment
@DanielLyons Проблема в том, что у меня нет конечных истин, таких как база данных. Другими словами, эти Customer на самом деле не существуют, поэтому customer(tomoyo, 24) логически не может быть истинной истиной. Вместо этого я генерирую все возможные Customers.   -  person Zhanwen Chen    schedule 21.05.2019
comment
customer(Name, Age) :- member(Name, [jodie, tengyu, adiche...]), between(18, 60, Age). Не случайно, но дает кучу всего.   -  person Daniel Lyons    schedule 21.05.2019
comment
@DanielLyons Спасибо. Еще одно практическое ограничение моей проблемы заключается в том, что мой список аргументов может быть очень длинным, поэтому использование сопоставления позиционных аргументов может ограничить читабельность и расширяемость.   -  person Zhanwen Chen    schedule 21.05.2019
comment
Это похоже на генерацию тестовых случаев. Это правильно?   -  person Guy Coder    schedule 21.05.2019
comment
@GuyCoder Звучит похоже. На самом деле я использую его для создания легальных сверточных нейронных сетей с учетом множества ограничений размера слоя.   -  person Zhanwen Chen    schedule 21.05.2019
comment
Я знаю, что такое convolutional neural network, но не знаю, что такое legal convolutional neural network, но я думаю, что это просто юридические данные для convolutional neural network, но фраза generate legal convolutional neural networks заставляет меня ломать голову над тем, что она означает. Если бы использовалась работа train вместо generate, это имело бы смысл.   -  person Guy Coder    schedule 21.05.2019
comment
@GuyCoder Под юридическими я подразумеваю размеры слоев ›= 1. Поскольку каждый слой зависит от предыдущего слоя, если у вас слишком большой размер ядра свертки (скажем, в первом слое), вы можете получить отрицательный выходной размер нескольких слоев. вниз и это плохо. Лучшее название для того, чем я занимаюсь, — поиск нейронной архитектуры.   -  person Zhanwen Chen    schedule 21.05.2019
comment
Таким образом, в основном, отложив в сторону вариант использования нейронной сети, вы хотите генерировать много данных, но с заданными ограничениями, и вас интересует, может ли Пролог это сделать. Ответ — да, вопрос в том, как использовать Prolog для этого. Используйте собственный письменный генератор, как заметил Даниэль, используйте модульный тест Prolog forall, используйте ограничения и/или Цепи Маркова — это только те, которые приходят мне в голову.   -  person Guy Coder    schedule 21.05.2019
comment
Ограничения Извините за неверную ссылку в предыдущем комментарии. Не могу изменить комментарий через 5 минут.   -  person Guy Coder    schedule 21.05.2019


Ответы (1)


В SWI-Prolog у вас действительно есть слова. Здесь:

?- between(2,3,X), Age is 20*X, member(Name, [tomoyo, tengyu]), Dict = customer{name:Name,
age:Age}.
X = 2,
Age = 40,
Name = tomoyo,
Dict = customer{age:40, name:tomoyo} ;
X = 2,
Age = 40,
Name = tengyu,
Dict = customer{age:40, name:tengyu} ;
X = 3,
Age = 60,
Name = tomoyo,
Dict = customer{age:60, name:tomoyo} ;
X = 3,
Age = 60,
Name = tengyu,
Dict = customer{age:60, name:tengyu}.

Вы можете добавлять и удалять пары ключ-значение из словарей во время выполнения. Единственное ограничение состоит в том, что ключи должны быть атомарными терминами.

Документация здесь:

http://www.swi-prolog.org/pldoc/man?section=bidicts

person User9213    schedule 22.05.2019