Задача про гномов на рудниках Грендальфа

      Комментарии к записи Задача про гномов на рудниках Грендальфа отключены

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

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

    questioner
    Участник

    Добрый день. Помогите пожалуйста решить головоломку.

    Дана задача:

    На рудниках злого волшебника Грендальфа уже много лет трудятся пять гномов. По приказу чародея каждый из них ищет камни строго определённого вида. Грендальф хранит в своей канцелярии два списка узников: список имён, в котором имена гномов расположены по алфавиту, и список сроков, упорядоченный по возрастанию сроков заключения, среди которых есть 80,159,176 и 202 года.

    Известно, что:

    • Гном с кайлом стоит в списке сроков сразу после искателя сапфиров.
    • Брыкли в списке сроков следует сразу за гномом с турбобуром. Однако Брыкли
      придётся работать всё же не так долго, как специалисту по изумрудам.
    • Искателю изумрудов придётся томиться в подземелье дольше, чем Фигли, но и тот
      трудится уже больше 80 лет.
    • Звякли никогда не имел дела с сапфирами. В списке сроков он стоит прямо перед
      искателем агатов.
    • Квакли в списке сроков следует сразу за гномом с киркой и прямо перед гномом с
      отбойным молотком, ищущим алмазы.
    • Имя гнома, специализирующегося на алмазах, стоит в списке имён сразу после
      имени бедняги, который заключён на 131 год.

     

    Нужно ответить на вопросы:

    • Кто ищет рубины?
    • Кто работает заступом?
    • Каков срок заточения у Дрихли?

    На данный момент есть такой код:

    domains
      tname=string
      ttool=string
      tsrok=integer
      tston=string
      tsroki=tsroki(tname, tsrok, tston, ttool)
      tsrokilist=tsroki*
       
    predicates
      puzzle
      structure(tsrokilist)
      key(tsrokilist)
      question(tsrokilist, tname, tsrok)
      solution(tname, tsrok)
       
      tgname(tsroki,tname)
      tgtool(tsroki,ttool)
      tgston(tsroki,tston)
      tgsrok(tsroki,tsrok)
       
      stateafter(tsroki, tsroki, tsrokilist)
       
      member(tsroki,tsrokilist)
       
    goal
      puzzle.
       
    clauses
      puzzle:-
        structure(Struct),
        key(Struct),
        question(Struct, Name, Srok),
        solution(Name, Srok).
         
      structure([
        tsroki(_,80,_,_),
        tsroki(_,131,_,_),
        tsroki(_,159,_,_),
        tsroki(_,176,_,_),
        tsroki(_,202,_,_)
      ]).
      %structure(
      %[tsroki(_,_,_,_),
      %tsroki(_,_,_,_),
      %tsroki(_,_,_,_),
      %tsroki(_,_,_,_),
      %tsroki(_,_,_,_)]
      %).
     
       
    key(Sroki):-
      % объявление камней:
      %member(tsroki(_,80,_,_),Sroki),
      %member(tsroki(_,131,_,_),Sroki),
      %member(tsroki(_,159,_,_),Sroki),
      %member(tsroki(_,176,_,_),Sroki),
      %member(tsroki(_,202,_,_),Sroki),
       
        % объявление камней:
      %member(tsroki(_,_,"Almaz",_),Sroki),
      %member(tsroki(_,_,"Rubin",_),Sroki),
      %member(tsroki(_,_,"Sapfir",_),Sroki),
      %member(tsroki(_,_,"Agat",_),Sroki),
      %member(tsroki(_,_,"Izumrud",_),Sroki),
        % объявление инструментов:
      %member(tsroki(_,_,_,"Kailo"),Sroki),           
      %member(tsroki(_,_,_,"Turbobur"),Sroki),
      %member(tsroki(_,_,_,"Kirka"),Sroki),
      %member(tsroki(_,_,_,"Molot"),Sroki),
      %member(tsroki(_,_,_,"Zastup"),Sroki),
       
     
    %     ключ 1:
    %  Гном с кайлом стоит в списке сроков сразу после искателя сапфиров.
      stateafter(Gn2, Gn1, Sroki),
      tgtool(Gn1,"Kailo"),
      tgston(Gn2,"Sapfir"),
       
    %     ключ 2:
    %  Брыкли в списке сроков следует сразу за гномом с турбобуром. Однако Брыкли     
    %   придётся работать всё же не так долго, как специалисту по изумрудам.
      stateafter(Gn4, Gn3, Sroki),
      stateafter(Gn3, Gn5, Sroki),
      tgname(Gn3,"Brikli"),
      tgtool(Gn4,"Turbobur"),
      tgston(Gn5,"Izumrud"),
       
    %     ключ 3:
    %  Искателю изумрудов придётся томиться в подземелье дольше, чем Фигли, но и тот 
    %   трудится уже больше 80 лет.
      stateafter(Gn7, Gn6, Sroki),
      stateafter(Gn8, Gn7, Sroki),
      tgston(Gn6,"Izumrud"),
      tgname(Gn7,"Figli"),
      tgsrok(Gn8,80),
       
    %     ключ 4:
    %  Звякли никогда не имел дела с сапфирами. В списке сроков он стоит прямо перед
    %   искателем агатов.
      stateafter(Gn9, Gn10, Sroki),
      tgname(Gn9,"Zvakli"),
      not(tgston(Gn9,"Sapfir")),
      tgston(Gn10,"Agat"),
    %     ключ 5:
    %  Квакли в списке сроков следует сразу за гномом с киркой и прямо перед гномом с
    %   отбойным молотком, ищущим алмазы.
      stateafter(Gn12, Gn11, Sroki),
      stateafter(Gn11, Gn13, Sroki),
      tgname(Gn11,"Kvakli"),
      tgtool(Gn12,"Kirka"),
      tgtool(Gn13,"Molot"),
      tgston(Gn13,"Almaz"),
       
    %   ключ 6:
    %  Имя гнома, специализирующегося на алмазах, стоит в списке имён сразу после
    %   имени бедняги, который заключён на 131 год.
      stateafter(Gn15, Gn14, Sroki),
      tgston(Gn14,"Almaz"),
      tgsrok(Gn15,131).
     
      question(Sroki, Name, Srok):-
        %Вопрос 1 
        member(G1,Sroki),
        tgname(G1,Name),
        tgston(G1,"Rubin"),
        %Вопрос 2
        member(G2,Sroki),
        tgname(G2,Name),
        tgtool(G2,"Zastup"),
        %Вопрос 3
        member(G3,Sroki),
        tgsrok(G3,Srok),
        tgname(G3,"Drihli").
      solution(Name, Srok):-
        write("Rubin ishet Gnom"), write(Name), nl,
        write("Zastupom rabotaet Gnom"), write(Name), nl,
        write("Srok y Drihli"), write(Srok).
       
      stateafter(A,B,[A,B,C]).
      stateafter(A,C,[A,B,C]).
      stateafter(B,C,[A,B,C]). 
      tgname(tsroki(A,B,C,D),A).  %Имя
      tgsrok(tsroki(A,B,C,D),B).  %Срок
      tgston(tsroki(A,B,C,D),C).  %Камни
      tgtool(tsroki(A,B,C,D),D).  %Инструменты
       
       
      member(X,[X|Y]).
      member(X,[_|Y]):-
        member(X,Y).

    При запуске на трурбо прологе выдает 2 предупреждения:

    The variable is only used once

    Здесь:
    stateafter(A,B,[A,B,C]).

    The variable is not bound in this clause

    Здесь:

    structure(
      [tsroki(_,_,_,_),
      tsroki(_,_,_,_),
      tsroki(_,_,_,_),
      tsroki(_,_,_,_),
      tsroki(_,_,_,_)]
    ).

    В диалоговое окно ничего не выводит.

  • #1847

    Если интерпретатор выдает лишь предупреждения, то код должен запускаться.
    В Turbo Prolog есть отладчик, попробуйте его использовать чтобы найти точку, в которой останавливается программа (если она запускается).

    The variable is only used once

    Интерпретатор предупреждает о том, что переменной дано имя, но она не используется. Устраняется такое предупреждение введением анонимной переменной (символ подчеркивания).

    stateafter(A,B,[A,B,C]).

    Переменная C не используется, поэтому интерпретатор оповещает вас на случай если вы планировали что-то написать, но забыли. Во всех остальных фрагментах примерно тоже самое.
    Исправляется так:
    stateafter(A,B,[A,B,_C]).

    Тут переменная _C является анонимной, предупреждение выдаваться не должно.

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

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