Первая статья о Satchmo (также перечисленная в упомянутых выше «Вариациях на тему»):
Райнер Манти и Франсуа Брай. SATCHMO: доказатель теоремы, реализованный в Прологе. В материалах 9-й Международной конференции по автоматическому удержанию, стр. 415–434. Springer-Verlag, 1988.
В статье представлено несколько реализаций Satchmo на Прологе и обсуждены их достоинства. Также приведены некоторые примеры. Вот версия Satchmo, которую я использовал в качестве отправной точки моего рассуждения RACE для контролируемого английского языка Attempto:
:- op(1200, xfx, '--->').
:- unknown(_, fail).
satisfiable :-
setof(Clause, violated_instance(Clause), Clauses),
!,
satisfy_all(Clauses),
satisfiable.
satisfiable.
violated_instance((B ---> H)) :-
(B ---> H),
B,
\+ H.
satisfy_all([]).
satisfy_all([(_B ---> H) | RestClauses]) :-
H,
!,
satisfy_all(RestClauses).
satisfy_all([(_B ---> H) | RestClauses]) :-
satisfy(H),
satisfy_all(RestClauses).
/*
satisfy((A,B)) :-
!,
satisfy(A),
satisfy(B).
*/
satisfy((A;B)) :-
!,
(satisfy(A) ; satisfy(B)).
satisfy(Atom) :-
\+ Atom = untrue,
(
predicate_property(Atom, built_in)
->
call(Atom)
;
assume(Atom)
).
assume(Atom) :-
% nl, write(['Asserting ': Atom]),
asserta(Atom).
assume(Atom) :-
% nl, write(['Retracting ': Atom]),
retract(Atom),
!,
fail.