#
#
#

from phidias.Types import *
from phidias.Lib import *
from phidias.Main import *

class number_of_stalls(Belief): pass # number_of_stalls(Floor, #Stalls)
class stall(Belief): pass # stall(Floor, Place, State = 'free'|'busy')
class arrival(Procedure): pass
class leave(Procedure): pass
class initialize(Procedure): pass
class count(Procedure): pass
class count(Procedure): pass

def_vars('Floor', 'Place', 'Stalls', 'StallNumber', 'State', 'N')

initialize() >> [ initialize(1) ]

initialize(6) >> [ ]
initialize(Floor) / number_of_stalls(Floor, Stalls) >> \
	[ initialize(Floor, 1, Stalls),
	  "Floor = Floor + 1",
	  initialize(Floor) ]

initialize(Floor, StallNumber, Stalls) / gt(StallNumber, Stalls) >> [ ]
initialize(Floor, StallNumber, Stalls) >> \
	[
		+stall(Floor, StallNumber, 'free'),
		"StallNumber = StallNumber + 1",
		initialize(Floor, StallNumber, Stalls)
	]


count(State) >> [ count(State, 0, 1) ]

count(State, N, 6) >> [ show_line('Numero di stalli ', State, '=', N) ]
count(State, N, Floor) / number_of_stalls(Floor, Stalls) >> \
	[ count(State, Floor, N, 1, Stalls) ]

count(State, Floor, N, StallNumber, Stalls) / gt(StallNumber, Stalls) >> \
	[ "Floor = Floor + 1",
	  count(State, N, Floor) ]

count(State, Floor, N, StallNumber, Stalls) / stall(Floor, StallNumber, State) >> \
	[
		"N = N + 1",
		"StallNumber = StallNumber + 1",
		count(State, Floor, N, StallNumber, Stalls)
	]
count(State, Floor, N, StallNumber, Stalls) >> \
	[
		"StallNumber = StallNumber + 1",
		count(State, Floor, N, StallNumber, Stalls)
	]



arrival() / stall(Floor, Place, 'free') >> \
	[
		-stall(Floor, Place, 'free'),
		+stall(Floor, Place, 'busy'),
		show_line('Stallo selezionato ', Place, ' piano ', Floor)
	]
arrival() >> [ show_line('Parcheggio pieno') ]

leave(Floor, Place) / stall(Floor, Place, 'busy') >> \
	[
		-stall(Floor, Place, 'busy'),
		+stall(Floor, Place, 'free'),
		show_line('Stallo liberato ', Place, ' piano ', Floor)
	]

PHIDIAS.run()
PHIDIAS.shell(globals())

