Nano Hash - криптовалюты, майнинг, программирование

Определение гибкой структуры в Прологе

Что ж, я немного новичок в Прологе, поэтому мой вопрос касается шаблона/логики Пролога.

У меня отношения под названием планшет. У него много параметров, таких как имя, OperationSystem, ramCapacity и т. д. У меня есть много объектов/предикатов этого отношения, например

tablet(
         name("tablet1"),
         operatingSystem("ios"),
         ramCapacity(1024),
         screen(
                  type("IPS"),
                  resolution(1024,2048)
               )
      ).

tablet(
         name("tablet2"),
         operatingSystem("android"),
         ramCapacity(2048),
         screen(
                  type("IPS"),
                  resolution(1024,2048),
                  protected(yes)
               ),
          isSupported(yes)
      ).

И некоторые другие подобные отношения, НО с другим количеством параметров. Некоторые атрибуты в разных объектах мне не нужны ИЛИ я создал несколько планшетов, и однажды добавил еще одно поле и начал использовать его в новых планшетах.

Есть два вопроса:

  1. Мне нужно использовать максимально гибкую структуру в прологе. У некоторых планшетов есть атрибуты/внутренние предикаты, а у некоторых нет, но все они планшеты.
  2. Мне нужно получить доступ к данным самым простым способом, например, найти все планшеты с ramCapacity (1024), не включая те, которые не имеют этого атрибута.
  3. Мне нужно изменить значения некоторых атрибутов самым простым способом. Например запрос - измените ramCapacity на 2048 для планшета с именем "tablet1".
  4. Если это возможно, это должно быть красиво читать в текстовом редакторе :)

Является ли эта структура гибкой? Должен ли я использовать другой? Нужны ли мне дополнительные правила для управления этой структурой? Легко ли изменить эту структуру с помощью запроса? (Я храню эту структуру в файле).

16.02.2015

Ответы:


1

Поскольку количество атрибутов не является фиксированным и должно быть настолько гибким, рассмотрите возможность представления этих элементов в виде списков параметров, например:

tablet([name=tablet1,
        operating_system=ios,
        ram_capacity=1024,
        screen=screen([type="IPS",
                       resolution = res(1024,2048)])]).

tablet([name=tablet2,
        operating_system=android,
        ram_capacity=2048,
        screen=screen([type="IPS",
                       resolution = res(1024,2048)]),
        is_supported=yes]).

Вы можете легко запрашивать и произвольно расширять такие списки. Пример:

?- tablet(Ts), member(name=tablet2, Ts).
Ts = [name=tablet2, operating_system=android, ram_capacity=2048, screen=screen([type="IPS", resolution=res(..., ...)]), is_supported=yes] ;
false.

Обратите также внимание на общий Пролог naming_convention_to_use_underscores_for_readability вместо mixingCasesAndMakingEverythingExtremelyHardToRead.

16.02.2015
  • Легко ли обновить некоторые атрибуты с помощью запроса, например: все планшеты с операционной_системой = Android меняют разрешение экрана на 2048,2048? 17.02.2015
  • Вы можете сделать это с помощью запроса вида: ?- tablet(Ts0), member(operating_system=android, Ts0), select(screen=screen(Scs0), Ts0, Ts1), select(resolution=_, Scs0, Scs1), Ts = [screen=screen([resolution=res(2048,2048)|Scs1])|Ts1]., получая как Ts обновленный список атрибутов. Добавление portray_clause(tablet(Ts)) в конце выводит его таким образом, что он может легко заменить предыдущее определение этого элемента. 17.02.2015
  • О, спасибо, и последний вопрос, как вставить атрибут, если он пропущен? 17.02.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..