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

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

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

  • Автор
    Сообщения
  • #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 (если Вам не понятен код в этой задаче — рекомендую прочитать ее).

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