#include "fuzzc.h"
char __IDOM[2];                                         
/*  LINGUISTIC Shelf_time TYPE int  MIN 0  MAX 1500 */
/*   { */
int  Shelf_time ;
/*     MEMBER long     { 60, 100,  1500, 1500 } */
/*
 
  1-|   ...............................  
    |   .                             .  
    |   .                             .  
    |  .                              .  
  0-| ..                              .  
     ----------------------------------
      0     375     750    1125    1500
 
*/
char Shelf_time_long (int __CRISP) 
  {
  if (__CRISP < 60) return(0);
  else 
    {
    if (__CRISP <= 100) return(((__CRISP - 60) * 6) + 7);
    else
      {
        return(255);
      }
    }
  }
/*     MEMBER short    {  0,   0,    40,   60 } */
/*
 
  1-| ..                                 
    | ..                                 
    | ..                                 
    | ..                                 
  0-| .................................  
     ----------------------------------
      0     375     750    1125    1500
 
*/
char Shelf_time_short (int __CRISP) 
  {
    {
    if (__CRISP <= 40) return(255);
    else
      {
      if (__CRISP <= 60)
        return((( + 60 - __CRISP) * 12) + 7);
      else
        return(0);
      }
    }
  }
/*   } */
/*
 
     Fuzzy Sets for Shelf_time
 
  1-| .................................  
    | ...                             .  
    | ...                             .  
    | ..                              .  
  0-| .................................  
     ----------------------------------
      0     375     750    1125    1500
 
 
*/
/*  LINGUISTIC Shelf_life  TYPE int  MIN 0  MAX 1500 */
/*   { */
int  Shelf_life ;
/*    MEMBER Short     {  0, 0,  30,  60 } */
/*
 
  1-| ..                                 
    | ..                                 
    | ..                                 
    | ..                                 
  0-| .................................  
     ----------------------------------
      0     375     750    1125    1500
 
*/
char Shelf_life_Short (int __CRISP) 
  {
    {
    if (__CRISP <= 30) return(255);
    else
      {
      if (__CRISP <= 60)
        return((( + 60 - __CRISP) * 8) + 7);
      else
        return(0);
      }
    }
  }
/*    MEMBER Long      { 30,60, 300, 360 } */
/*
 
  1-|  ......                            
    |  .     .                           
    |  .     .                           
    |  .      .                          
  0-| ..      .........................  
     ----------------------------------
      0     375     750    1125    1500
 
*/
char Shelf_life_Long (int __CRISP) 
  {
  if (__CRISP < 30) return(0);
  else 
    {
    if (__CRISP <= 60) return(((__CRISP - 30) * 8) + 7);
    else
      {
      if (__CRISP <= 300) return(255);
      else
        {
        if (__CRISP <= 360)
          return((( + 360 - __CRISP) * 4) + 7);
        else
          return(0);
        }
      }
    }
  }
/*    MEMBER Forever   {  0, 0,1500,1500 } */
/*
 
  1-| .................................  
    | .                               .  
    | .                               .  
    | .                               .  
  0-| .                               .  
     ----------------------------------
      0     375     750    1125    1500
 
*/
char Shelf_life_Forever (int __CRISP) 
  {
    {
      return(255);
    }
  }
/*   } */
/*
 
     Fuzzy Sets for Shelf_life
 
  1-| .................................  
    | ..     .                        .  
    | ..     .                        .  
    | ..      .                       .  
  0-| ..      .........................  
     ----------------------------------
      0     375     750    1125    1500
 
 
*/
/*  LINGUISTIC Payment  TYPE int  MIN 0  MAX 300 */
/*   { */
int  Payment ;
/*     MEMBER Prompt      {  0,   0,  30,  45 } */
/*
 
  1-| ....                               
    | .   .                              
    | .   .                              
    | .    .                             
  0-| .    ............................  
     ----------------------------------
      0      75     150     225     300
 
*/
char Payment_Prompt (int __CRISP) 
  {
    {
    if (__CRISP <= 30) return(255);
    else
      {
      if (__CRISP <= 45)
        return(( + 45 - __CRISP) * 17);
      else
        return(0);
      }
    }
  }
/*     MEMBER Normal      { 30,  45,  60,  75 } */
/*
 
  1-|      ..                            
    |      . .                           
    |     .  .                           
    |     .   .                          
  0-| ....    .........................  
     ----------------------------------
      0      75     150     225     300
 
*/
char Payment_Normal (int __CRISP) 
  {
  if (__CRISP < 30) return(0);
  else 
    {
    if (__CRISP <= 45) return((__CRISP - 30) * 17);
    else
      {
      if (__CRISP <= 60) return(255);
      else
        {
        if (__CRISP <= 75)
          return(( + 75 - __CRISP) * 17);
        else
          return(0);
        }
      }
    }
  }
/*     MEMBER Eventually  { 60,  80, 180, 300 } */
/*
 
  1-|          ...........               
    |          .            .            
    |         .                 .        
    |        .                      .    
  0-| .......                         .  
     ----------------------------------
      0      75     150     225     300
 
*/
char Payment_Eventually (int __CRISP) 
  {
  if (__CRISP < 60) return(0);
  else 
    {
    if (__CRISP <= 80) return(((__CRISP - 60) * 12) + 7);
    else
      {
      if (__CRISP <= 180) return(255);
      else
        {
          return((( + 300 - __CRISP) * 2) + 7);
        }
      }
    }
  }
/*     MEMBER Nagging     { 75, 120, 300, 300 } */
/*
 
  1-|              ....................  
    |             .                   .  
    |            .                    .  
    |          .                      .  
  0-| .........                       .  
     ----------------------------------
      0      75     150     225     300
 
*/
char Payment_Nagging (int __CRISP) 
  {
  if (__CRISP < 75) return(0);
  else 
    {
    if (__CRISP <= 120) return(((__CRISP - 75) * 5) + 15);
    else
      {
        return(255);
      }
    }
  }
/*   } */
/*
 
     Fuzzy Sets for Payment
 
  1-| .... ..  ........................  
    | .   .. . .  .         .         .  
    | .   .  ..  .              .     .  
    | .   .. ...                    . .  
  0-| .... .. .........................  
     ----------------------------------
      0      75     150     225     300
 
 
*/
/*  LINGUISTIC Quantity  TYPE int  MIN 0  MAX 500 */
/*   { */
int  Quantity ;
/*    MEMBER Small   {  1, 3,  3,  5 } */
/*
 
  1-| .                                  
    | .                                  
    | .                                  
    | .                                  
  0-| .................................  
     ----------------------------------
      0     125     250     375     500
 
*/
char Quantity_Small (int __CRISP) 
  {
  if (__CRISP < 1) return(0);
  else 
    {
    if (__CRISP <= 3) return((__CRISP - 1) * 127);
    else
      {
        {
        if (__CRISP <= 5)
          return(( + 5 - __CRISP) * 127);
        else
          return(0);
        }
      }
    }
  }
/*    MEMBER Normal  {  2, 5,  7, 10 } */
/*
 
  1-| .                                  
    | .                                  
    | ..                                 
    | ..                                 
  0-| .................................  
     ----------------------------------
      0     125     250     375     500
 
*/
char Quantity_Normal (int __CRISP) 
  {
  if (__CRISP < 2) return(0);
  else 
    {
    if (__CRISP <= 5) return((__CRISP - 2) * 85);
    else
      {
      if (__CRISP <= 7) return(255);
      else
        {
        if (__CRISP <= 10)
          return(( + 10 - __CRISP) * 85);
        else
          return(0);
        }
      }
    }
  }
/*    MEMBER Large   {  7,10, 25, 30 } */
/*
 
  1-|  ..                                
    |  ..                                
    |  ..                                
    | . .                                
  0-| . ...............................  
     ----------------------------------
      0     125     250     375     500
 
*/
char Quantity_Large (int __CRISP) 
  {
  if (__CRISP < 7) return(0);
  else 
    {
    if (__CRISP <= 10) return((__CRISP - 7) * 85);
    else
      {
      if (__CRISP <= 25) return(255);
      else
        {
        if (__CRISP <= 30)
          return(( + 30 - __CRISP) * 51);
        else
          return(0);
        }
      }
    }
  }
/*    MEMBER huge    { 25,50,500,500 } */
/*
 
  1-|    ..............................  
    |    .                            .  
    |    .                            .  
    |   .                             .  
  0-| ...                             .  
     ----------------------------------
      0     125     250     375     500
 
*/
char Quantity_huge (int __CRISP) 
  {
  if (__CRISP < 25) return(0);
  else 
    {
    if (__CRISP <= 50) return(((__CRISP - 25) * 10) + 2);
    else
      {
        return(255);
      }
    }
  }
/*   } */
/*
 
     Fuzzy Sets for Quantity
 
  1-| .................................  
    | ....                            .  
    | ....                            .  
    | ...                             .  
  0-| .................................  
     ----------------------------------
      0     125     250     375     500
 
 
*/
/*  LINGUISTIC Customer  TYPE int  MIN 0  MAX 150 */
/*   { */
int  Customer ;
/*    MEMBER New      {  1, 1,  2,  2 } */
/*
 
  1-| .                                  
    | .                                  
    | .                                  
    | .                                  
  0-| .................................  
     ----------------------------------
      0      38      75     113     150
 
*/
char Customer_New (int __CRISP) 
  {
  if (__CRISP < 1) return(0);
  else 
    {
    if (__CRISP <= 2) return(255);
    else
      {
        return(0);
      }
    }
  }
/*    MEMBER Recent   {  2, 5, 10, 20 } */
/*
 
  1-|  ..                                
    |  . .                               
    |  . .                               
    | .   .                              
  0-| .   .............................  
     ----------------------------------
      0      38      75     113     150
 
*/
char Customer_Recent (int __CRISP) 
  {
  if (__CRISP < 2) return(0);
  else 
    {
    if (__CRISP <= 5) return((__CRISP - 2) * 85);
    else
      {
      if (__CRISP <= 10) return(255);
      else
        {
        if (__CRISP <= 20)
          return((( + 20 - __CRISP) * 25) + 2);
        else
          return(0);
        }
      }
    }
  }
/*    MEMBER LongTerm {  5,10,150,150 } */
/*
 
  1-|   ...............................  
    |   .                             .  
    |   .                             .  
    |  .                              .  
  0-| ..                              .  
     ----------------------------------
      0      38      75     113     150
 
*/
char Customer_LongTerm (int __CRISP) 
  {
  if (__CRISP < 5) return(0);
  else 
    {
    if (__CRISP <= 10) return((__CRISP - 5) * 51);
    else
      {
        return(255);
      }
    }
  }
/*   } */
/*
 
     Fuzzy Sets for Customer
 
  1-| .................................  
    | ....                            .  
    | ....                            .  
    | ..  .                           .  
  0-| ..  .............................  
     ----------------------------------
      0      38      75     113     150
 
 
*/
/*  CONSEQUENCE discount TYPE float DEFUZZ cg */
/*   { */
float  discount ;
  int fa_discount, fc_discount;
/*    MEMBER deep    { 120 } */
/*
 
  1-|                                 .  
    |                                 .  
    |                                 .  
    |                                 .  
  0-| ................................*  
     ----------------------------------
      0      30      60      90     120
 
 
*/
void discount_deep (float __DOM) 
  {
     fc_discount += __DOM;
     fa_discount += (__DOM * (120));
  }
/*    MEMBER large   {  65 } */
/*
 
  1-|                  .                 
    |                  .                 
    |                  .                 
    |                  .                 
  0-| .................*...............  
     ----------------------------------
      0      30      60      90     120
 
 
*/
void discount_large (float __DOM) 
  {
     fc_discount += __DOM;
     fa_discount += (__DOM * (65));
  }
/*    MEMBER high    {  50 } */
/*
 
  1-|              .                     
    |              .                     
    |              .                     
    |              .                     
  0-| .............*...................  
     ----------------------------------
      0      30      60      90     120
 
 
*/
void discount_high (float __DOM) 
  {
     fc_discount += __DOM;
     fa_discount += (__DOM * (50));
  }
/*    MEMBER special {  35 } */
/*
 
  1-|          .                         
    |          .                         
    |          .                         
    |          .                         
  0-| .........*.......................  
     ----------------------------------
      0      30      60      90     120
 
 
*/
void discount_special (float __DOM) 
  {
     fc_discount += __DOM;
     fa_discount += (__DOM * (35));
  }
/*    MEMBER normal  {  20 } */
/*
 
  1-|      .                             
    |      .                             
    |      .                             
    |      .                             
  0-| .....*...........................  
     ----------------------------------
      0      30      60      90     120
 
 
*/
void discount_normal (float __DOM) 
  {
     fc_discount += __DOM;
     fa_discount += (__DOM * (20));
  }
/*    MEMBER low     {   5 } */
/*
 
  1-|  .                                 
    |  .                                 
    |  .                                 
    |  .                                 
  0-| .*...............................  
     ----------------------------------
      0      30      60      90     120
 
 
*/
void discount_low (float __DOM) 
  {
     fc_discount += __DOM;
     fa_discount += (__DOM * (5));
  }
/*    MEMBER none    {   0 } */
/*
 
  1-| .                                  
    | .                                  
    | .                                  
    | .                                  
  0-| *................................  
     ----------------------------------
      0      30      60      90     120
 
 
*/
void discount_none (float __DOM) 
  {
     fc_discount += __DOM;
     fa_discount += (__DOM * (0));
  }
/*   } */
/*  FUZZY CalculateDiscount */
void CalculateDiscount (void)
  {
     fa_discount = 0;
     fc_discount = 0;
/*    { */
/*      IF shelf_time IS long     THEN discount IS large */
  discount_large( shelf_time_long(shelf_time)  );
/*      IF shelf_time IS short    THEN discount IS low */
  discount_low( shelf_time_short(shelf_time)  );
/*      IF shelf_life IS short    THEN discount IS high */
  discount_high( shelf_life_short(shelf_life)  );
/*      IF shelf_life IS Long     THEN discount IS normal */
  discount_normal( shelf_life_Long(shelf_life)  );
/*      IF quantity   IS small    THEN discount IS none */
  discount_none( quantity_small(quantity)  );
/*      IF quantity   IS large    THEN discount IS large */
  discount_large( quantity_large(quantity)  );
/*      IF quantity   IS huge     THEN discount IS high */
  discount_high( quantity_huge(quantity)  );
/*      IF Customer   IS new      THEN discount IS special */
  discount_special( Customer_new(Customer)  );
/*      IF customer   IS recent   THEN discount IS normal */
  discount_normal( customer_recent(customer)  );
/*      IF customer   IS longterm THEN discount IS large */
  discount_large( customer_longterm(customer)  );
/*      IF shelf_life IS short AND */
/*         shelf_time IS long     THEN discount IS deep */
  __IDOM[1] = shelf_life_short(shelf_life) ;
  __IDOM[0] = shelf_time_long(shelf_time) ;
  __IDOM[0] = F_AND(__IDOM[1],__IDOM[0]);
  discount_deep( __IDOM[0] );
/*    } */
    if (fc_discount == 0)
     discount = 0;
    else
     discount = fa_discount / fc_discount;
   }
 void main (void)
   {
//    . . . Application code to get crisp numbers for
//          Cost Markup Shelf_time Shelf_life  Payment  Quantity  Customer
    CalculateDiscount ();
    Quote = (cost + (cost * markup)) * ( 1.0 - (discount / 100.0));
   }
