Логическая задача: Аладар, Бела и Балаш. Аптекарь, бухгалтер, агроном

      Комментарии к записи Логическая задача: Аладар, Бела и Балаш. Аптекарь, бухгалтер, агроном отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Решение головоломок на Prolog Логическая задача: Аладар, Бела и Балаш. Аптекарь, бухгалтер, агроном

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

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

    olga013
    Участник

    Доброго времени суток!
    Прошу помощи. Надо написать программу на прологе. Задача:

    Познакомим читателей с тремя людьми: Аладаром, Белой и Балашом. Один из них аптекарь, другой — бухгалтер, третий — агроном. Один живет в Будапеште, другой- в Бекешчабе, третий — в Асоде. Требуется выяснить, кто где живет и у какого какая профессия.
    Извсетно лишь, что
    1 Балаш бывает в Будапеште лишь наездами и то весьма редко, хотя все его родственники постоянно живут в столице;
    2 у двух из этих людей название профессий и городов, в которых они живут, начинаются с той же буквы, что и их имена;
    3 жена аптекаря доводится Балашу младшей сестрой.

    Как правильно составить правила для данной задачи и где мои ошибки?
    Вот сам код (visual prolog 7):

    implement main
      open core
    
    predicates
      name(string)
      town(string)
      job(string)
      condition1(string,string,string)
      condition2(string,string,string)
      condition3(string,string,string)
      condition4(string,string,string)
      condition5(string,string,string)
      allocation(string, string, string,string,string,string,string,string,string)
    
    clauses
      run() :-
        name(Balash).
      name(Bela).
      name(Aladar).
      town(Budapest).
      town(Bekescsaba).
      town(Aszod).
      job(aptekar).
      job(agronom).
      job(buhgalter).
    
    /* устанавливаем взаимооднозначные соответствия*/
    /* между множеством имён, городов и профессий X - name, Y - town, Z - job*/
    condition1 (X,Y,Z) :- name(X), town(Y), job(Z),
      X=Balash, not (Y=Budapest), not (Z=aptekar), Y<>Z.
      condition2 (X,Y,Z) :- name(X), town(Y), job(Z),
      X=Balash, not (Y=Aszod), not (Z=agronom), Y<>Z.
      condition3 (X,Y,Z) :- name(X), town(Y), job(Z),
      X=Bela, not(Y=Bekescsaba), not (Z=buhgalter), Y<>Z.
      condition4 (X,Y,Z) :- name(X), town(Y), job(Z),
      X=Bela, not(Y=Aszod), not (Z=agronom), Y<>Z.
      condition5 (X,Y,Z) :- name(X), town(Y), job(Z),
      X=Aladar, not (Y=Bekescsaba), not(Z=agronom), Y<>Z.
      allocation(X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3):-
      X1=Balash, condition (X1,Y1,Z1),
      X2=Bela, condition (X2,Y2,Z2),
      X3=Aladar, condition (X3,Y3,Z3),
      Y1<>Y2, Y2<>Y3, Y1<>Y3,
      Z1<>Z2, Z2<>Z3, Z1<>Z3.
    % succeed. % place your own code here
    
    end implement main
    
    goal
    
      allocation(X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3),
      write(X1," town- ",Y1," job- ",Z1),nl,
      write(X2," town- ",Y2," job- ",Z2),nl,
      write(X3," town- ",Y3," job- ",Z3),nl.
    
      %console::runUtf8(main::run).

  • #2515

    Здравствуйте. Я не использую Visual Prolog 7.x, но постараюсь помочь.
    Во-первых, поясните что вы хотели сделать за счет функции run (я вижу, что она вызывалась в разделе goal, но эта строка закомментирована), почему-то эта функция не описана в разделе predicates, но реализована в разделе clauses (при этом вызывает name(balsh)).

    Во-вторых, у вас однозначно есть ошибка при описании фактов. Все имена, начинающиеся с большой буквы в прологе означают переменные. Т.е. name(Bela). содержит описание несвязанной переменной Bella. Т.к. переменная не связана, то вызов пройдет успешно с любым значением, например name(«balash») вернет true и Bela="balash".

    В-третьих, почему вы думаете, что ваш код работает неправильно? (выдает какие-то конкретные ошибки или вы не получаете ожидаемый результат?

    Наконец есть пара советов — посмотрите:

    • введение в Prolog очень быстро поможет разобраться с тем как работают программы на этом языке и почему name(Bela) ведет себя так, а не иначе;
    • правила кодирования на Prolog — это очень простые рекомендации, за счет соблюдения которых код будет гораздо понятнее;
    • решение логических задач на Prolog поможет разобраться с тем, как решить именно вашу проблему (смотрите раздел «задачи на установление соответствия» — там есть примеры решенных задач такого типа).

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