domains
  file     = in
  value    = integer
  mast     = char
  color    = red; black
  card     = card (value, mast)
  cards    = card*
  position = cards*
  liststr  = string*
  freePole = freePole (card, card, card, card)
  endPole  = endPole (cards, cards, cards, cards)
  allPole  = allPole (position, freePole, endPole)
  pole     = freePole (integer); card (integer); endPole (integer)
  listPole = allPole*
  step     = step (pole, pole)
  steps    = step*

predicates
  begin        (string, steps)
  find         (allPole, listPole, steps)
  member       (allPole, listPole)
  color        (mast, color)
  test         (allPole)
  testPos      (position)
  testFree     (freePole)
  stepDelCard  (allPole, allPole, pole, card)
  stepAddCard  (allPole, allPole, pole, card)
  stepDelPole  (position, position, integer, card)
  stepAddPole  (position, position, integer, card)
  stepDelFree  (freePole, freePole, integer, card)
  stepAddFree  (freePole, freePole, integer, card)
  stepAddEnd   (EndPole , EndPole , integer, card)
  testCard     (card, card)
  ReadStartPos (string, position)
  ReadString   (position, position)
  PrintSteps   (steps)
  PrintCard    (pole)
  split        (string, liststr)
  split1       (string, liststr)
  prepare      (liststr, position, position)
  mast         (char, mast)
  value        (string, value)

clauses
  begin (Name) :-
    ReadStartPos (Name, Pos),
    find (allPole (Pos, freePole (_, _, _, _), endPole ([], [], [], [])), [], Steps),
    PrintSteps (Steps).

  find (Pole, _, []) :-
    test (Pole), !.
  find (Pole, List, _) :-
    member (Pole, List), !,
    fail.
  find (In, List, [step (Del, Add) | Rest]) :-
    stepDelCard (In, New, Del, Card),
    stepAddCard (New, Out, Add, Card),
    find (Out, [In | List], Rest).

  member (X, [X | _]) :- !.
  member (X, [_ | Rest]) :-
    member (X, Rest).

  color ('ў', black).
  color ('з', red).
  color ('Ў', red).
  color ('Є', black).

  test (allPole (Pos, FreePos, _)) :-
    testPos (Pos),
    testFree (FreePos).
    
  testpos ([]).
  testpos ([[] | T]) :-
    testpos (T).
    
  testFree (freePole (C1, C2, C3, C4)) :-
    free (C1) and
    free (C2) and
    free (C3) and
    free (C4).

  stepDelCard (allPole (PoleIn, FreeCard, EndCard), allPole (PoleOut, FreeCard, EndCard), card (N), Card) :-
    stepDelPole (PoleIn, PoleOut, N, Card).
  stepDelCard (allPole (Pole, FreeCardIn, EndCard), allPole (Pole, FreeCardOut, EndCard), freePole (N), Card) :-
    stepDelFree (FreeCardIn, FreeCardOut, N, Card).

  stepAddCard (allPole (PoleIn, FreeCard, EndCard), allPole (PoleOut, FreeCard, EndCard), card (N), Card) :-
    stepAddPole (PoleIn, PoleOut, N, Card).
  stepAddCard (allPole (Pole, FreeCardIn, EndCard), allPole (Pole, FreeCardOut, EndCard), freePole (N), Card) :-
    stepAddFree (FreeCardIn, FreeCardOut, N, Card).
  stepAddCard (allPole (Pole, FreeCard, EndCardIn), allPole (Pole, FreeCard, EndCardOut), endPole (N), Card) :-
    stepAddEnd (EndCardIn, EndCardOut, N, Card).

  stepDelPole ([[Card | List] | Rest], [List | Rest], 1, Card).
  stepDelPole ([List | Rest], [List | RestOut], N, Card) :-
    stepDelPole (Rest, RestOut, K, Card),
    N = K + 1.

  stepDelFree (freePole (Card1, Card2, Card3, Card4), freePole (_, Card2, Card3, Card4), 1, Card1).
  stepDelFree (freePole (Card1, Card2, Card3, Card4), freePole (Card1, _, Card3, Card4), 2, Card2).
  stepDelFree (freePole (Card1, Card2, Card3, Card4), freePole (Card1, Card2, _, Card4), 3, Card3).
  stepDelFree (freePole (Card1, Card2, Card3, Card4), freePole (Card1, Card2, Card3, _), 4, Card4).

  stepAddFree (freePole (Card1, Card2, Card3, Card4), freePole (Card, Card2, Card3, Card4), 1, Card) :-
    free (Card1).
  stepAddFree (freePole (Card1, Card2, Card3, Card4), freePole (Card1, Card, Card3, Card4), 2, Card) :-
    free (Card2).
  stepAddFree (freePole (Card1, Card2, Card3, Card4), freePole (Card1, Card2, Card, Card4), 3, Card) :-
    free (Card3).
  stepAddFree (freePole (Card1, Card2, Card3, Card4), freePole (Card1, Card2, Card3, Card), 4, Card) :-
    free (Card4).

  stepAddEnd (endPole ([card (V1, Mast) | Rest], Card2, Card3, Card4),
              endPole ([card (V2, Mast), card (V1, Mast) | Rest], Card2, Card3, Card4), 1, card (V2, Mast)) :-
    V2 = V1 + 1.
  stepAddEnd (endPole (Card1, [card (V1, Mast) | Rest], Card3, Card4),
              endPole (Card1, [card (V2, Mast), card (V1, Mast) | Rest], Card3, Card4), 2, card (V2, Mast)) :-
    V2 = V1 + 1.
  stepAddEnd (endPole (Card1, Card2, [card (V1, Mast) | Rest], Card4),
              endPole (Card1, Card2, [card (V2, Mast), card (V1, Mast) | Rest], Card4), 3, card (V2, Mast)) :-
    V2 = V1 + 1.
  stepAddEnd (endPole (Card1, Card2, Card3, [card (V1, Mast) | Rest]),
              endPole (Card1, Card2, Card3, [card (V2, Mast), card (V1, Mast) | Rest]), 4, card (V2, Mast)) :-
    V2 = V1 + 1.
  stepAddEnd (endPole ([], Card2, Card3, Card4), endPole ([card (1, Mast)], Card2, Card3, Card4), 1, card (1, Mast)).
  stepAddEnd (endPole (Card1, [], Card3, Card4), endPole (Card1, [card (1, Mast)], Card3, Card4), 2, card (1, Mast)).
  stepAddEnd (endPole (Card1, Card2, [], Card4), endPole (Card1, Card2, [card (1, Mast)], Card4), 3, card (1, Mast)).
  stepAddEnd (endPole (Card1, Card2, Card3, []), endPole (Card1, Card2, Card3, [card (1, Mast)]), 4, card (1, Mast)).

  stepAddPole ([[] | Rest], [[Card] | Rest], 1, Card).
  stepAddPole ([[Card1 | List] | Rest], [[Card, Card1 | List] | Rest], 1, Card) :-
    testCard (Card, Card1).
  stepAddPole ([List | Rest], [List | RestOut], N, Card) :-
    stepAddPole (Rest, RestOut, K, Card),
    N = K + 1.

  testCard (card (Val1, Mast1), card (Val2, Mast2)) :-
    color (Mast1, Color),
    not (color (Mast2, Color)),
    Val1 = Val2 - 1.

  ReadString ([], []) :-
    eof (in), !.
  ReadString (In, Out) :-
    readln (Str),
    split (Str, List),
    prepare (List, In, Pos), !,
    ReadString (Pos, Out).
  ReadString (List, List).

  PrintSteps ([]) :- !.
  PrintSteps ([step (PoleFrom, PoleTo) | Rest]) :-
    write ("From: "),
    PrintCard (PoleFrom),
    write (" to "),
    PrintCard (PoleTo), nl,
    PrintSteps (Rest).

  PrintCard (freePole (N)) :-
    write ("free pole ", N).
  PrintCard (card (N)) :-
    write ("column ", N).
  PrintCard (endPole (N)) :-
    write ("end pole ", N).

  ReadStartPos (File, Pos) :-
    openread (in, File),
    readdevice (in),
    ReadString ([], Pos),
    closefile (in).

  split ("", []) :- !.
  split (In, ["" | List]) :-
    frontchar (In, ' ', Rest), !,
    split1 (Rest, List).
  split (In, [Out | List]) :-
    frontchar (In, C, Rest),
    split (Rest, [Str | List]),
    frontchar (Out, C, Str).

  split1 ("", []) :- !.
  split1 (In, List) :-
    frontchar (In, ' ', Rest), !,
    split1 (Rest, List).
  split1 (In, [Out | List]) :-
    frontchar (In, C, Rest),
    split (Rest, [Str | List]),
    frontchar (Out, C, Str).

  prepare ([], List, List) :- !.
  prepare ([Str | List], [], [[card (Val, Mast)] | OutList]) :-
    !, frontchar (Str, M, V),
    mast (M, Mast),
    value (V, Val),
    prepare (List, [], OutList).
  prepare ([Str | List], [Rest | InList], [[card (Val, Mast) | Rest] | OutList]) :-
    frontchar (Str, M, V),
    mast (M, Mast),
    value (V, Val),
    prepare (List, InList, OutList).

  mast ('t', 'т').
  mast ('c', 'ч').
  mast ('b', 'б').
  mast ('v', 'в').
  mast ('T', 'т').
  mast ('C', 'ч').
  mast ('B', 'б').
  mast ('V', 'в').
  mast ('т', 'т').
  mast ('ч', 'ч').
  mast ('б', 'б').
  mast ('в', 'в').
  mast ('Т', 'т').
  mast ('Ч', 'ч').
  mast ('Б', 'б').
  mast ('В', 'в').

  value ("t" ,  1).
  value ("2" ,  2).
  value ("3" ,  3).
  value ("4" ,  4).
  value ("5" ,  5).
  value ("6" ,  6).
  value ("7" ,  7).
  value ("8" ,  8).
  value ("9" ,  9).
  value ("10", 10).
  value ("j" , 11).
  value ("q" , 12).
  value ("k" , 13).
  value ("J" , 11).
  value ("Q" , 12).
  value ("K" , 13).
  value ("в" , 11).
  value ("д" , 12).
  value ("к" , 13).
  value ("В" , 11).
  value ("Д" , 12).
  value ("К" , 13).
    
Hosted by uCoz