Кто что любит

Помечено: 

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 2 нед., 4 дн. назад.

  • Автор
    Сообщения
  • #4214

    Имеется база данных, содержащая следующие факты:

    любит("Анна", яблоки).
    любит("Сергей", бананы).
    любит("Андрей", яблоки).
    любит("Света", шоколад).
    любит("Вова", шоколад).
    любит("Анна", шоколад).
    любит("Света", апельсины).
    любит("Вова", бананы).

    Составить программу, определяющую:
    a) всех, кто любит бананы;
    b) кто любит и шоколад, и яблоки;
    c) что любит Вова;
    d) что любят и Света, и Вова.

    Несмотря на то, что стоит задача “составить программу”, как таковая программа тут не нужна, достаточно написать ряд запросов. Подобные запросы были рассмотрены в моем “мини учебнике по Prolog для начинающих” (всего страниц 10 текста), при этом там они проиллюстрированы картинками. При любых вопросах – загляните сначала туда.

    Итак, по-порядку:
    1) Чтобы вывести всех кто любит бананы достаточно написать такой запрос:
    любит(Х, бананы).
    Результаты работы:

    При этом пролог пытается сопоставить с этим правилом все факты из базы, как видно из снимка экрана – первым он находит Сергея и предлагает нам его, но чтобы вывести всех надо нажать на точку с запятой (в SWI Prolog). Turbo Prolog по умолчанию выведет всех сразу. Чтобы добиться аналогичного эффекта в SWI Prolog (и некоторых других диалектах) напишите такой запрос:
    ?- любит(X, бананы), write(X), nl, fail;!.

    Если запрос не понятен – загляните во “введение в Prolog”.

    2) Чтобы вывести всех кто любит “и шоколад, и яблоки”, достаточно соединить два вызова предиката любит запятой. Запятая в языке Пролог как раз соответствует логическому И:

    Тут мы просим найти такое X, что любит шоколад, а затем проверяем что в базе есть запись о том, что этот же X любит яблоки.

    3) Чтобы узнать что любит Вова достаточно вместо вида еды передать анонимную переменную, интерпретатор языка Prolog сопоставит наш запрос с каждым фактом базы и поочередно присвоит этой переменной каждое подошедшее значение:

    любит("Вова", X).

    4) предикат проверки “что любят и Света, и Вова” строится аналогично предикату, выбирающему тех, кто любит и яблоки, и шоколад – просто соединяем два вызова запятой:

    ?- любит("Вова", X), любит("Света", X).

Для ответа в этой теме необходимо авторизоваться.