Satchmoに関する最初の論文(上記の「テーマのバリエーション」にも記載されています)は
レイナー・マンタイとフランソワ・ブライ。SATCHMO:Prologに実装された定理証明者。自動控除に関する第9回国際会議の議事録、415〜434ページ。Springer-Verlag、1988年。
このペーパーでは、SatchmoのいくつかのProlog実装を紹介し、それらのメリットについて説明します。また、いくつかの例を示します。これは、私がAttemptoControlledEnglishの推論RACEの開始点として使用したSatchmoバージョンです。
:- 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.