:- consult(fuzzyfns).

% Inputs are: Load dirtiness and Load volume
% Output is: Washing Time

% Abbreviations
% D = load Dirtiness
% V = load Volume
% T = washing Time

% Load Dirtiness

load_dirtiness([not_dirty, lightly_dirty, medium_dirty, very_dirty]).

not_dirty(1, D) :- D =< 0, !.
not_dirty(MuD, D) :- D<2, D>0, MuD is (-D/2 + 1), !. 
not_dirty(0, D) :- D >= 2, !.

lightly_dirty(0, D) :- D=<1.
lightly_dirty(MuD, D) :- D>1, D<3, MuD is (D/2 - 1/2), !.
lightly_dirty(1, 3).
lightly_dirty(MuD, D) :- D>3, D<5, MuD is (-D/2 + 5/2), !.
lightly_dirty(0, D) :- D>=5, !.

very_dirty(0, D) :- D=<6, !.
very_dirty(MuD, D) :- D>6, D<10, MuD is (D/4 - 6/4), !. 
very_dirty(1, D) :- D >=10, !.

% Load Volume

load_volume([low_load, medium_load, full_load]).

low_load(1, V) :- V=<0, !.
low_load(MuV, V) :- V>0, V<4, MuV is (-V/4 + 1), !.
low_load(0, V) :- V >=4, !.

medium_load(0, V) :- V =<2, !.
medium_load(MuV, V) :- V>2, V<5, MuV is (V/3 - 2/3), !. 
medium_load(1, 5).
medium_load(MuV, V) :- V>5, V<8, MuV is (-V/3 + 8/3), !.
medium_load(0, V) :- V >= 8, !.

% Washing Time

washing_time([little_time, medium_time, long_time, very_long_time]).

little_time(1, T) :- T=<10, !.
little_time(MuT, T) :- T>10, T<30, MuT is (-T/20 + 30/20), !. 
little_time(0, T) :- T>=30, !.

medium_time(0, T) :- T=<20, !. 
medium_time(MuT, T) :- T>20, T<50, MuT is (T/30 - 20/30), !.
medium_time(1,50).
medium_time(MuT, T) :- T>50, T<60, MuT is (-T/10 + 60/10), !.
medium_time(0,T) :- T>= 60, !.

very_long_time(0, T) :- T=<90, !.
very_long_time(MuT, T) :- T>90, T<120, MuT is (T/30 - 90/30), !.
very_long_time(1, T) :- T>=120.

% List of rules of the form "if ANTECEDENTS then CONSEQUENCE."

  if load_volume(full_load) 
 and load_dirtiness(very_dirty)
then washing_time(very_long_time).

  if load_volume(full_load)
 and load_dirtiness(medium_dirty) 
then washing_time(very_long_time).

% fill in missing rule here

  if load_volume(full_load)
 and load_dirtiness(not_dirty) 
then washing_time(little_time).

  if load_volume(medium_load) 
 and load_dirtiness(very_dirty) 
then washing_time(very_long_time).

  if load_volume(medium_load) 
 and load_dirtiness(lightly_dirty) 
then washing_time(medium_time).

% fill in missing rule here

  if load_volume(medium_load)
 and load_dirtiness(not_dirty) 
then washing_time(little_time).

  if load_volume(low_load)
 and load_dirtiness(very_dirty) 
then washing_time(long_time).

  if load_volume(low_load) 
 and load_dirtiness(medium_dirty) 
then washing_time(long_time).

  if load_volume(low_load) 
 and load_dirtiness(lightly_dirty) 
then washing_time(little_time).

% fill in missing rule here.
