% File: ECMI01.FF_UTILS
% Author: Peter hammond, IC, 1982. Rewritten by Peter Ross
% Updated: 30 Nov 1983
% Purpose: utilities used in other FAULTFINDER modules

:- op(50, xfy, and).
:- op(60, xfy, or).
:- op(70, xfy, if).
:- op(950, xfy, & ).
:- op(960, xfy, :).	% 950 > ','

once(X) :- X, !.

member(A, [A|_]).
member(A, [_|Rest]) :- member(A, Rest).

memberchk(A, [A|_]) :- !.
memberchk(A, [_|Rest]) :- memberchk(A, Rest).

read_poss_ans(Answer) :- 
	get(NonBlankChar),
	skip(10),		% to end of line
	lowercase(NonBlankChar, LowerChar),
	read_poss_ans(LowerChar, Answer).

lowercase(Upper, Lower) :- Upper =< "Z", !, Lower is Upper + 32.
lowercase(Char, Char).

read_poss_ans(121, yes) :- !.	% 121 = y
read_poss_ans(110, no) :- !.	% 110 = n
read_poss_ans(100, dunno) :- !.	% 100 = d
read_poss_ans(119, why) :- !.	% 119 = w
read_poss_ans(Other, Ans) :-
	explain_replies,
	read_poss_ans(Ans).

explain_replies :-
	write(
'The answers must start with
   y or Y   meaning "yes"
   n or N   meaning "no"
   d or D   meaning "I don''t know"
   w or W   meaning "why do you want to know"
').

opposite_ans(yes, no).	% Used to check whether an actual reply
opposite_ans(no, yes).	% contradicts an expected reply.

erase_old(Key, Term) :-		% Sweeps out anything under Key matching Term
	(recorded(Key, Term, Ref), erase(Ref), fail; true).

add_fact(Fault, NewState) :-
	erase_old(fact, state(Fault, _)),
	recordz(fact, state(Fault, NewState), _).

know(Fault, State) :-		% Fault states are recorded under key 'fact'
	recorded(fact, state(Fault, State), _).