Skip to content
Snippets Groups Projects
led.lus 8.55 KiB
Newer Older
Erwan Jahier's avatar
Erwan Jahier committed
include "arduino_puzzle.lus"

const F=false;
const T=true;

const led1_0 = Eteint;
const led2_0 = Allume;
const led3_0 = Eteint;
const led4_0 = Allume;
const led5_0 = Eteint; 
----------------------------------------------------------------------------
-- blue => permutation circulaire
-- red  => inverse l'état de la led 5
node puzzle1 (red,blue:bool) returns (led1,led2,led3,led4,led5:bool);
let
  led1 = led1_0 -> if blue then pre(led5) else pre(led1) ;
  led2 = led2_0 -> if blue then pre(led1) else pre(led2) ;
  led3 = led3_0 -> if blue then pre(led2) else pre(led3) ;
  led4 = led4_0 -> if blue then pre(led3) else pre(led4) ;
  led5 = led5_0 -> if blue then pre(led4) else  
                   if red  then not(pre(led5)) else pre(led5) ;
tel
Erwan Jahier's avatar
Erwan Jahier committed
      
----------------------------------------------------------------------------
----------------------------------------------------------------------------
const Eteint=false;
const Allume=true;

Erwan Jahier's avatar
Erwan Jahier committed
-- demo : mettre Allume au debut, puis Eteint apres la 1ere expe
-- const led1_00 = Eteint; 
const led1_00 = Allume;
const led2_00 = Allume;
const led3_00 = Eteint;
const led4_00 = Eteint;
const led5_00 = Eteint; 
Erwan Jahier's avatar
Erwan Jahier committed
  
----------------------------------------------------------------------------
Erwan Jahier's avatar
Erwan Jahier committed
-- bouton bleu => permutation circulaire des leds
-- bouton rouge  => inverse l'état des leds 2 et 4
node puzzle2 (red,blue:bool) returns (led1,led2,led3,led4,led5:bool);
Erwan Jahier's avatar
Erwan Jahier committed
let
  led1 = led1_00 -> if blue then pre(led5) else pre(led1) ;
  led2 = led2_00 -> if blue then pre(led1) else if red then not(pre(led2))
                                                       else     pre(led2) ;
  led3 = led3_00 -> if blue then pre(led2) else pre(led3) ;
  led4 = led4_00 -> if blue then pre(led3) else if red then not(pre(led4))
                                                       else     pre(led4) ;
  led5 = led5_00 -> if blue then pre(led4) else pre(led5) ;
Erwan Jahier's avatar
Erwan Jahier committed
const led1_000 = Eteint;
const led2_000 = Allume;
const led3_000 = Eteint;
const led4_000 = Allume;
const led5_000 = Eteint; 
Erwan Jahier's avatar
Erwan Jahier committed
----------------------------------------------------------------------------
-- blue => permutation circulaire
-- red  => inverse une led qui circule a chaque pression de boutons
node puzzle3 (red,blue:bool) returns (led1,led2,led3,led4,led5:bool);
var
  X1, X2, X3, X4, X5 : bool;
let
  X1, X2, X3, X4, X5 = (true,F, F,  F, F) ->  
    if red or blue then
      (
        if pre X1 then (F, F, F, F, true) else
        if pre X2 then (true, F, F, F, F) else
        if pre X3 then (F, true, F, F, F) else
        if pre X4 then (F, F, true, F, F) else
                       (F, F, F, true, F)
      )
    else (pre X1, pre X2, pre X3, pre X4, pre X5);
  
Erwan Jahier's avatar
Erwan Jahier committed
  led1 = led1_000 -> if blue then pre(led5) else
Erwan Jahier's avatar
Erwan Jahier committed
                   if red and X1 then not(pre(led1)) else pre(led1);
Erwan Jahier's avatar
Erwan Jahier committed
  led2 = led2_000 -> if blue then pre(led1) else
Erwan Jahier's avatar
Erwan Jahier committed
                   if red and X2 then not(pre(led2)) else pre(led2);
Erwan Jahier's avatar
Erwan Jahier committed
  led3 = led3_000 -> if blue then pre(led2) else
Erwan Jahier's avatar
Erwan Jahier committed
                   if red and X3 then not(pre(led3)) else pre(led3);
Erwan Jahier's avatar
Erwan Jahier committed
  led4 = led4_000 -> if blue then pre(led3) else
Erwan Jahier's avatar
Erwan Jahier committed
                   if red and X4 then not(pre(led4)) else pre(led4);
Erwan Jahier's avatar
Erwan Jahier committed
  led5 = led5_000 -> if blue then pre(led4) else
Erwan Jahier's avatar
Erwan Jahier committed
                   if red and X5 then not(pre(led5)) else pre(led5);
tel
      
----------------------------------------------------------------------------
Erwan Jahier's avatar
Erwan Jahier committed
-- dans ce puzzle, une 
-- red  => inverse l'état  d'une led  qui circule  en montant
--  (led1, puis led2, etc.) à chaque pression
-- blue => permutation circulaire des leds + permutation inverse
--  (en descandant) de la led courante controllée par le bouton rouge
Erwan Jahier's avatar
Erwan Jahier committed
node puzzle4 (red,blue:bool) returns (led1,led2,led3,led4,led5:bool);
var
  X1, X2, X3, X4, X5 : bool;
let
  X1, X2, X3, X4, X5 = (F, F, F, F, true) ->  
    if red then
      (
        if pre X1 then (F, true, F, F, F) else
        if pre X2 then (F, F, true, F, F) else
        if pre X3 then (F, F, F, true, F) else
        if pre X4 then (F, F, F, F, true) else
                       (true, F, F, F, F)
       )
    else if blue then
      (
        if pre X1 then (F, F, F, F, true) else
        if pre X2 then (true, F, F, F, F) else
        if pre X3 then (F, true, F, F, F) else
        if pre X4 then (F, F, true, F, F) else
                       (F, F, F, true, F)
      )
    else (pre X1, pre X2, pre X3, pre X4, pre X5);
  
  led1 = led1_0 -> if blue then pre(led5) else
                   if red and X1 then not(pre(led1)) else pre(led1);
  led2 = led2_0 -> if blue then pre(led1) else
                   if red and X2 then not(pre(led2)) else pre(led2);
  led3 = led3_0 -> if blue then pre(led2) else
                   if red and X3 then not(pre(led3)) else pre(led3);
  led4 = led4_0 -> if blue then pre(led3) else
                   if red and X4 then not(pre(led4)) else pre(led4);
  led5 = led5_0 -> if blue then pre(led4) else
                   if red and X5 then not(pre(led5)) else pre(led5);
tel
----------------------------------------------------------------------------
Erwan Jahier's avatar
Erwan Jahier committed
-- phase d'init sur les 5 premieres pressions : le bleu eteint , et le rouge allume
Erwan Jahier's avatar
Erwan Jahier committed
-- blue => la led courante devient le xor des leds autours 
-- red  => la led courante devient le and des leds autours
-- la led courante est le premiere au debut, puis la deuxieme, etc.  

Erwan Jahier's avatar
Erwan Jahier committed
const led1_p5 = T;
Erwan Jahier's avatar
Erwan Jahier committed
const led2_p5 = F;
Erwan Jahier's avatar
Erwan Jahier committed
const led3_p5 = T;
const led4_p5 = F;
const led5_p5 = T;
Erwan Jahier's avatar
Erwan Jahier committed

  
node puzzle5(red,blue:bool)
returns (led1,led2,led3,led4,led5:bool);
var
  X1, X2, X3, X4, X5 : bool;
let
  X1, X2, X3, X4, X5 = (F, F, F, F, true) ->  
    if red or blue then
      (
        if pre X1 then (F, true, F, F, F) else
        if pre X2 then (F, F, true, F, F) else
        if pre X3 then (F, F, F, true, F) else
        if pre X4 then (F, F, F, F, true) else
                       (true, F, F, F, F)
       )
    else (pre X1, pre X2, pre X3, pre X4, pre X5);
  
  led1 = led1_p5 -> if blue and X1 then (pre(led5) xor pre(led2)) else
                      if red  and X1 then (pre(led5) and pre(led2)) else pre(led1);
  led2 = led2_p5 -> if blue and X2 then (pre(led1) xor pre(led3)) else
                      if red  and X2 then (pre(led1) and pre(led3)) else pre(led2);
  led3 = led3_p5 -> if blue and X3 then (pre(led2) xor pre(led4)) else
                      if red  and X3 then (pre(led2) and pre(led4)) else pre(led3);
  led4 = led4_p5 -> if blue and X4 then (pre(led3) xor pre(led5)) else
                      if red  and X4 then (pre(led3) and pre(led5)) else pre(led4);
  led5 = led5_p5 -> if blue and X5 then (pre(led4) xor pre(led1)) else
                      if red  and X5 then (pre(led4) and pre(led1)) else pre(led5);
tel

----------------------------------------------------------------------------

-- red  => inversion  de la led 1
-- blue => allume la led suivant la première led eteinte
-- pour l'odre lexicographique (i.e.,led1<led2<led3<led4<led5)
Erwan Jahier's avatar
Erwan Jahier committed

node puzzle6(red,blue:bool)
returns (led1,led2,led3,led4,led5:bool);
var
  --  Xi = je suis la led qui suit la plus petite led eteinte 
Erwan Jahier's avatar
Erwan Jahier committed
  X2, X3, X4, X5 : bool;
let
  X2, X3, X4, X5 = (true, F, F, F) ->  
        if not(pre(led1)) then (true, F, F, F) else
        if not(pre(led2)) then (F, true, F, F) else
        if not(pre(led3)) then (F, F, true, F) else
        if not(pre(led4)) then (F, F, F, true) else (F, F, F, F);
  led1 = F -> if red then not(pre(led1)) else pre(led1);
  led2 = F -> if blue and X2 then not(pre(led2)) else pre(led2);
  led3 = F -> if blue and X3 then not(pre(led3)) else pre(led3);
  led4 = F -> if blue and X4 then not(pre(led4)) else pre(led4);
  led5 = F -> if blue and X5 then not(pre(led5)) else pre(led5);
Erwan Jahier's avatar
Erwan Jahier committed
tel
----------------------------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------------------------------------------------
-- Pour lesar 
node puzzle_has_no_solution <<
   node puzzle(red,blue:bool) 
   returns (led1,led2,led3,led4,led5:bool)>>
(red,blue:bool) returns (no_sol:bool);
var
  led1,led2,led3,led4,led5:bool;
let
  assert(not(blue and red)); -- just to ease the replay of counter-examples
Erwan Jahier's avatar
Erwan Jahier committed
  led1,led2,led3,led4,led5=puzzle(red,blue);
  no_sol = not (led1 and led2 and led3 and led4 and led5);
tel

node puzzle1_has_no_solution = puzzle_has_no_solution <<puzzle1>>
node puzzle2_has_no_solution = puzzle_has_no_solution <<puzzle2>>
node puzzle3_has_no_solution = puzzle_has_no_solution <<puzzle3>>
node puzzle4_has_no_solution = puzzle_has_no_solution <<puzzle4>>
node puzzle5_has_no_solution = puzzle_has_no_solution <<puzzle5>>
node puzzle6_has_no_solution = puzzle_has_no_solution <<puzzle6>>


Erwan Jahier's avatar
Erwan Jahier committed
node fedge(s:bool) returns (res:bool);
Erwan Jahier's avatar
Erwan Jahier committed
let
Erwan Jahier's avatar
Erwan Jahier committed
  res = false -> pre(s) and not s;