Prolog 检查包含假设的逻辑序列是否有效

Prolog 检查包含假设的逻辑序列是否有效,prolog,logic,gnu,Prolog,Logic,Gnu,好的,我正在编写一个程序来读取一组包含逻辑序列的文本文件,例如: [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)] ]. 然后检查证明是否有效。到目前为止,我已经为不包含假设的规则编写了所有我

好的,我正在编写一个程序来读取一组包含逻辑序列的文本文件,例如:

[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.
有效行(证明,[[uu,imp(O,U),impint(N1,N2)]):-
成员([N1,O,假设],证据),
成员([N2,U,_],证明),
N1

不起作用。所以我有点卡住了,我不知道如何继续。

我想知道到目前为止这是怎么回事,你在第一次呼叫时就放弃了预赛和进球。为什么?@capelic老实说,我不是一个专业的程序员或任何东西,只是开始使用Prolog和一个朋友一起做这件事,我们只是调整它,直到它工作。现在,它正确地确认了正确的证据,并拒绝了那些没有给出的证据,即它们没有使用假设。我想放弃预科和预科是因为证据中已经有了预科和预科。我认为你应该遵循“预科”的步骤,从“预科”开始,转变到“预科”,或者报告“预科失败”…@抱歉,我在听讲座。有没有关于我该怎么做的建议?正如我所说,在prolog方面不是很有经验,所以最糟糕的部分是开始一个程序。