さて、次のような論理シーケンスを含む一連のテキスト ファイルを読み取るプログラムを作成しています。
[and(p,q), and(r,s)].
and(p,s).
[
[1, and(p,q), premise],
[2, and(r,s), premise],
[3, p, andel1(1)],
[4, s, andel2(2)],
[5, and(p,s), andint(3,4)]
].
そして、証明が有効かどうかを確認します。これまでのところ、仮定を含まないルールについて考えられるすべての述語を書いてきましたが、うまくいきました。これまでのコードは次のとおりです。
verify(InputFileName) :- see(InputFileName),
read(Prems), read(Goal), read(Proof),
seen,
valid_proof(Prems, Goal, Proof).
valid_proof(_Prems, _Goal, Proof) :-
valid_proof_(Proof, Proof).
valid_proof_(_, []).
valid_proof_(Proof, [Line|Lines]) :-
valid_line(Proof, Line),
valid_proof_(Proof, Lines).
valid_line(_Proof, [_N, _S, premise]).
valid_line(Proof, [_Ln3, U, impel(Ln2, Ln1)]) :-
member([Ln1, imp(O, U), _], Proof),
member([Ln2, O, _], Proof).
valid_line(Proof, [_, and(A,B), andint(Ln,Lm)]) :-
member([Ln, A, _], Proof),
member([Lm, B, _], Proof).
valid_line(Proof, [_, A, andel1(N)]) :-
member([N, and(A,_B), _], Proof).
valid_line(Proof, [_, B, andel2(N)]) :-
member([N, and(_A,B), _], Proof).
valid_line(Proof, [_, or(A,_B), orint1(N)]) :-
member([N, A, _], Proof).
valid_line(Proof, [_, or(_A,B), orint2(N)]) :-
member([N, B, _], Proof).
valid_line(Proof, [_, A, copy(N)]) :-
member([N, A, _], Proof).
valid_line(Proof, [_, neg(O), mt(N1, N2)]) :-
member([N1, imp(O,U), _], Proof),
member([N2, neg(U), _], Proof).
valid_line(Proof, [_, O, negnegel(N)]) :-
member([N, neg(neg(O)), _], Proof).
valid_line(Proof, [_, neg(neg(O)), negnegint(N)]) :-
member([N, O, _], Proof).
valid_line(Proof, [_, or(O, neg(O)), lem]) :-
member([_, _, _], Proof).
問題は、たとえば、仮定を使用して証明に対して同じことを行うために、問題を解決する必要があることです。
[q].
imp(p,q).
[
[1, q, premise],
[
[2, p, assumption],
[3, q, copy(1)]
],
[4, imp(p,q), impint(2,3)]
].
リスト内のリストであるため、他のパターンで使用したのと同じパターンを使用してそれを行うことはできません。だから、このようなもの:
valid_line(Proof, [_, imp(O, U), impint(N1, N2)]) :-
member([N1, O, assumption], Proof),
member([N2, U, _], Proof),
N1 < N2.
うまくいきません。だから私は少し立ち往生しています、私は続行する方法がわかりません。