Составление слов-мутантов на Visual Prolog

      Комментарии к записи Составление слов-мутантов на Visual Prolog отключены

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

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

    Nika
    Участник

    Имеется решенная задача, работает правильно — составляет слова-мутанты из имеющихся слов.

    Объясните, пожалуйста, как работает в данном случае append. Совершенно непонятно. Я знаю, что append принимает на вход три списка, третий из которых — это сумма двух первых. Но в данной задаче не понятно как он работает.

    domains
      type = string
      lst = char*
    predicates
      run
      style_mutant
      mutant(lst)
      animal(type)
      append(lst, lst, lst)
      str_list(type, lst)
      print_list(lst)
      write_list (lst)
    goal
      run.
    clauses
      run:- 
        write("   Êðàñèâûå ìóòàíòû: \n\n"), 
        style_mutant.
    
      style_mutant:- 
        mutant(X), 
        print_list(X), 
        fail.
    
      mutant(Z):- 
        animal(XSt), 
        str_list(XSt, X), 
        animal(YSt), 
        str_list(YSt, Y),
        append(_, [B|Bs], X),
        write_list([B|Bs]),nl,
        append([B|Bs], [C|Cs], Y),
        write_list([C|Cs]),nl,
        append(X, [C|Cs], Z).
    
      append([], Xs, Xs).
      append([X|Xs], Ys, [X|Zs]):- 
        append(Xs, Ys, Zs).
    
      animal("лошадь").
      animal("черепаха").
      animal("карибу").
      animal("крокодил").
    
      str_list("", []).
      str_list(Str, [X|Xs]) :- 
        frontchar(Str, X, Rest),
        str_list(Rest, Xs).
    
      print_list([]):- !, nl.
      print_list([X|Xs]):- 
        write(X), 
        print_list(Xs).
    
      write_list ([]).
      write_list ([Head|Tail]):- 
        write (Head), write ("   "), 
        write_list (Tail).

  • #2776

    Работа предиката str_list подробно описана тут: Преобразование строки в список символов. Turbo Prolog, но там предикат называется string_to_list (это более правильно, т.к. в международном стандарте ISO на Prolog есть такая функция, но она отсутствует в Turbo и Visual Prolog).

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

    Что касается функции append — то она может применяться не только для конкатенации (объединения) списков, но и для вычисления их разности, и даже — для генерации всех вариантов построения списка из двух частей. Более подробно это описано в статье, посвященной обработке списков в Prolog (если Вам не понятен код в этой задаче — рекомендую прочитать ее).

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