Prolog. Задачи на соответствие. Алиса в стране чудес

      Комментарии к записи Prolog. Задачи на соответствие. Алиса в стране чудес отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Решение головоломок на Prolog Prolog. Задачи на соответствие. Алиса в стране чудес

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

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

    Prolog
    Участник

    Условие: Алиса в стране чудес. Загадка: Была украдена мука, ее нашли в домике, где жил Мартовский заяц, Болванщик и Соня. Мартовский заяц сказал: «Муку украл Болванщик». Болванщик и Соня дали показания, но они утеряны. В ходе заседания выяснилось, что укравший муку дал правдивые показания.

    predicates
      imya(symbol) - nondeterm (o) nondeterm (i)
      ukradeno(symbol) - nondeterm (o)nondeterm (i)
      sootvetstvie(symbol,symbol) - nondeterm (i,i)nondeterm (i,o)
      reshenie(symbol,symbol,symbol,symbol,symbol,symbol) - nondeterm (i,i,i,i,i,i)nondeterm (o,o,o,o,o,o)
    clauses
      %% baza dannih imen
      imya(martovskyi zayac).
      imya(bolvanshik).
      imya(sonya).
      %% baza dannih ukradeno
      ukradeno(martovskim zaycem).
      ukradeno(bolvanshikom).
      ukradeno(sonyei).
      %% opredelim odnoznachnoye sootvetstvie I - imya, U - ukradeno
      sootvetstvie(I,U):-
        imya(I), I=martovskyi zayac, 
        ukradeno(U)
    

    Задумка правильная?

  • #2541

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

    imya(martovskyi zayac).
    ukradeno(martovskim zaycem).

    Кстати, в Вашей программе написано, что аргументы функций – списки, но вы передаете туда другие значения – пишите их в кавычках. Факт ukradeno в этой задаче не нужен, т.к. у нас по условию известно, что украсть могли только муку, но а вы вообще написали его так, что он фактически дублирует предикат imya. Вам нужен предикат с показаниями, после чего останется лишь проверить условие, чтобы показания вора были правдивыми.

  • #2664

    Для решения задачи вам нужно описать действующие лица:

    actor(bolvanshik).
    actor(zayac).
    actor(sonya).

    Затем высказывания:

    say(zayac, bolvanshik):-!.
    say(_Actor, Thief):-
      actor(Thief).

    Для поиска решения нужно запросить по высказыванию от каждого персонажа, поместить их в список, подобрать на место вора одно из персонажей и проверить чтобы только у него высказывание было истинным. Интерпретатор сам подберет вам нужные значения:

    solution(Stories, Thief):-
      say(zayac, ZayacStory),
      say(bolvanshik, BolvanshikStory),
      say(sonya, SonyaStory),
      
      Stories = [
        say(zayac, ZayacStory),
        say(bolvanshik, BolvanshikStory),
        say(sonya, SonyaStory)
      ],
      
      actor(Thief),
      thief_true_story(Stories, Thief).

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

    thief_true_story([], _Thief):-!.
    thief_true_story([say(Thief, Story)|Tail], Thief):-
      !, Story = Thief, thief_true_story(Tail, Thief).
    thief_true_story([say(_Actor, Story)|Tail], Thief):-
       Story \= Thief, 
      thief_true_story(Tail, Thief).

    Таким образом, возможны два варианта обвинений между действующими лицами, но в обоих из них вором будет являться соня (решения показаны на скриншоте).

    Вложения:

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