Ответ в теме: Кузнецов, Токарев, Слесарев и Резчиков играют в домино

      Комментарии к записи Ответ в теме: Кузнецов, Токарев, Слесарев и Резчиков играют в домино отключены
#1763

questioner
Участник

Я лишь мельком прочитал вашу статью и осознал, что мой случай не тривиален (дальше не читал).
Конкретные вопросы:

  • сперва вызывается
    permute([kuznecov,tokarev,slesarev,rezchikov],[A,B,C,D])
    Это предикат, который имеет входной список (состоящий из фамилий) и выходной(A,B,C,D).
    Затем он рекурсивно помещается сюда permute([],[]), а затем попадает в
    permute([H|Tail],P):-permute(Tail,T),insert(H,T,P).

    где permute([H|Tail],P) разделяет список на голову и хвост, в P будет помещен результат.
    permute(Tail,T) обходит рекурсивно по всему списку (до тех пор, пока в списке не останется 1 значение — в данном случае Резчиков).
    Затем, передаем нашего Резчикова в предикат insert(H,T,P) — где H хранит Резчикова, T и P пустые параметры.

  • совсем не понятно что происходит дальше:

    append([],B,B).
    append([H|Tail],B,[H|NewTail]):-
      append(B,Tail,NewTail).
     
    member(H,[H|_]).
    member(H,[_|Tail]):-
      member(H,Tail).
     
    naprotiv(A,B,[_,A,_,B]).
    naprotiv(B,A,[A,_,B,_]).
    naprotiv(B,A,[_,A,_,B]).
     
    sprava(A,B,[A,B,_,_]).
    sprava(A,B,[_,_,A,B]).
     
    sleva(A,B,L):-sprava(B,A,L).
     
    insert(Y,XZ,XYZ):-
      append(X,Z,XZ),append(X,[Y],XY),append(XY,Z,XYZ).

  • Почему member(m(S4,rezchik),L) не имеет такой же конструкции как и предыдущие правила?

Предположу что из за все возможных перестановок, при присвоении фамилии резчику(фамилия Резчиков будет уже соответствовать какой то из профессий?).