Управление поиском решений в программе - Prolog

Узнай цену своей работы

Формулировка задачи:

Задача: В симфонический оркестр приняли на работу трёх музыкантов: Брауна, Смита и Вессона, умеющих играть на скрипке, флейте, альте, кларнете, гобое и трубе. Известно, что: Смит самый высокий; играющий на скрипке меньше ростом играющего на флейте; играющие на скрипке и флейте и Браун любят пиццу; когда между альтистом и трубачом возникает ссора, Смит мирит их; Браун не умеет играть ни на трубе, ни на гобое. На каких инструментах играет каждый из музыкантов, если каждый владеет двумя инструментами? Ребят, если у вас нету готового решения или это сложнорешаемая задача, то, пожалуйста, объясните хотя бы, причем тут рост, любимая еда и взаимоотношения между музыкантами? Это ж логическое программирование, где здесь логика?

Решение задачи: «Управление поиском решений в программе»

textual
Листинг программы
domains 
instr_name=string
name_ig=string
name,instr1,instr2,name_instr=string
predicates
igrok(name,instr1,instr2)
instr(instr_name)
instr1(name_instr)
instr2(name_instr)
name(name_ig)
clauses
instr1(skripka).
instr1(fleyta).
instr1(alta).
instr1(klarnet).
instr1(goboy).
instr1(truba).
instr2(skripka).
instr2(fleyta).
instr2(alta).
instr2(klarnet).
instr2(goboy).
instr2(truba).
name(smit).
name(braun).
name(vasson).
igrok(Z,X,Y):-name(Z),instr1(X),instr2(Y).
igrok(braun,X,Y):-not(igrok(braun,skripka,Y)).
goal
igrok(name,instr1,instr2).

Объяснение кода листинга программы

  1. Задана база данных, включающая следующие факты:
    • instr1(skripka)
    • instr1(fleyta)
    • instr1(alta)
    • instr1(klarnet)
    • instr1(goboy)
    • instr1(truba)
    • instr2(skripka)
    • instr2(fleyta)
    • instr2(alta)
    • instr2(klarnet)
    • instr2(goboy)
    • instr2(truba)
    • name(smit)
    • name(braun)
    • name(vasson)
  2. Задана цель - найти решение для igrok(name,instr1,instr2).
  3. Переменные:
    • name - не пустая строка
    • instr1 - не пустая строка
    • instr2 - не пустая строка
  4. В коде определены следующие предикаты:
    • igrok(name,instr1,instr2) - предикат, который имеет решение, если существует такое имя, которое играет на инструменте 1 и инструменте 2
    • instr(instr_name) - предикат, который истинен, если в базе данных есть факт, в котором имя инструмента равно instr_name
    • instr1(name_instr) - предикат, который истинен, если в базе данных есть факт, в котором имя инструмента 1 равно name_instr
    • instr2(name_instr) - предикат, который истинен, если в базе данных есть факт, в котором имя инструмента 2 равно name_instr
    • name(name_ig) - предикат, который истинен, если в базе данных есть факт, в котором имя равно name_ig
  5. В коде определены следующие клаузы:
    • instr1(skripka)
    • instr1(fleyta)
    • instr1(alta)
    • instr1(klarnet)
    • instr1(goboy)
    • instr1(truba)
    • instr2(skripka)
    • instr2(fleyta)
    • instr2(alta)
    • instr2(klarnet)
    • instr2(goboy)
    • instr2(truba)
    • name(smit)
    • name(braun)
    • name(vasson)
  6. Для решения задачи используется метод поиска в глубину (DFS), который реализуется с помощью правил вывода в системе Prolog.
  7. Для поиска решения используется следующая логика:
    • Если существует решение для igrok(name,instr1,instr2), то оно будет найдено.
    • Если не существует решения для igrok(name,instr1,instr2), то будет проверено, существует ли решение для igrok(braun,X,Y).
    • Если решение для igrok(braun,X,Y) существует, то оно будет найдено.
  8. В результате выполнения кода будет найдено решение для igrok(braun,X,Y), где X и Y - это имена инструментов, которые играют на инструменте skripka и fleyta соответственно.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5