indexing
	description: "References to objects containing a boolean value"
	status: "See notice at end of class"
	date: "$Date$"
	revision: "$Revision$"

class interface
	BOOLEAN_REF

feature -- Access

	hash_code: INTEGER
			-- Hash code value
		ensure -- from HASHABLE
			good_hash_value: Result >= 0

	item: BOOLEAN
			-- Boolean value
	
feature -- Status report

	is_hashable: BOOLEAN
			-- May current object be hashed?
			-- (True if it is not its type's default.)
		ensure -- from HASHABLE
			ok_if_not_default: Result implies (Current /= default)
	
feature -- Element change

	set_item (b: BOOLEAN)
			-- Make b the item value.
	
feature -- Conversion

	to_integer: INTEGER
			-- 1 if True
			-- 0 if False
		ensure
			zero_or_one: Result = 0 or Result = 1
			item_implies_one: item implies Result = 1
	
feature -- Basic operations

	infix "and" (other: like Current): BOOLEAN
			-- Boolean conjunction with other
		require
			other_exists: other /= void
		ensure
			de_morgan: Result = not (not Current or not other)
			commutative: Result = (other and Current)
			consistent_with_semi_strict: Result implies (Current and then other)

	infix "and then" (other: like Current): BOOLEAN
			-- Boolean semi-strict conjunction with other
		require
			other_exists: other /= void
		ensure
			de_morgan: Result = not (not Current or else not other)

	infix "implies" (other: like Current): BOOLEAN
			-- Boolean implication of other
			-- (semi-strict)
		require
			other_exists: other /= void
		ensure
			definition: Result = (not Current or else other)

	prefix "not": like Current
			-- Negation

	infix "or" (other: like Current): BOOLEAN
			-- Boolean disjunction with other
		require
			other_exists: other /= void
		ensure
			de_morgan: Result = not (not Current and not other)
			commutative: Result = (other or Current)
			consistent_with_semi_strict: Result implies (Current or else other)

	infix "or else" (other: like Current): BOOLEAN
			-- Boolean semi-strict disjunction with other
		require
			other_exists: other /= void
		ensure
			de_morgan: Result = not (not Current and then not other)

	infix "xor" (other: like Current): BOOLEAN
			-- Boolean exclusive or with other
		require
			other_exists: other /= void
		ensure
			definition: Result = ((Current or other) and not (Current and other))
	
feature -- Output

	out: STRING
			-- Printable representation of boolean
	
invariant

	involutive_negation: is_equal (not (not Current))
	non_contradiction: not (Current and (not Current))
	completeness: Current or else (not Current)
		-- from ANY
	reflexive_equality: standard_is_equal (Current)
	reflexive_conformance: conforms_to (Current)

indexing
	library: "[
			EiffelBase: Library of reusable components for Eiffel.
	]"
	status: "[
			Copyright 1986-2001 Interactive Software Engineering (ISE).
			For ISE customers the original versions are an ISE product
			covered by the ISE Eiffel license and support agreements.
	]"
	license: "[
			EiffelBase may now be used by anyone as FREE SOFTWARE to
			develop any product, public-domain or commercial, without
			payment to ISE, under the terms of the ISE Free Eiffel Library
			License (IFELL) at http://eiffel.com/products/base/license.html.
	]"
	source: "[
			Interactive Software Engineering Inc.
			ISE Building
			360 Storke Road, Goleta, CA 93117 USA
			Telephone 805-685-1006, Fax 805-685-6869
			Electronic mail <info@eiffel.com>
			Customer support http://support.eiffel.com
	]"
	info: "[
			For latest info see award-winning pages: http://eiffel.com
	]"

end -- class BOOLEAN_REF