% 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), _).