0

我在序言中有以下代码,我希望能够在变量出现时对其进行测试:

mon_afn(
afn(
    [
        sommet(etat(0),[arc(b,etat(0)),arc(a,etat(1))]),
        sommet(etat(1),[arc(b,etat(2))])
    ], %liste d'adjacence
    etat(0), %etat initial
    [etat(2)] %etats acceptant
)).


accepte(AFN,MOT):-forall(AFN,accepte_(AFN,MOT)).

accepte_(AFN,MOT) :-
    afn(LISTEADJ,INITIAL,ACCEPTANTS) = AFN,
    accepte_(MOT,LISTEADJ,ACCEPTANTS,INITIAL).


accepte_([],_,ACCEPTANTS,ACC) :-
    member(ACC,ACCEPTANTS).

accepte_([LETTRE|MOT],LISTEADJ,ACCEPTANTS,ACC) :- 
    member(sommet(ACC,L),LISTEADJ),
    member(arc(LETTRE,D),L),
    accepte_(MOT,LISTEADJ,ACCEPTANTS,D).

accepte_2 允许确定 NFA 是否接受字符串,我的 accepte_ / 2 和 accepte_ / 4 谓词按我的意愿工作,但我想要一个 accepte/2 谓词,它将执行以下操作:

? mon_afd(X),accepte(X,['a','b']).
true.

我不想要什么:

? mon_afd(X),accepte(X,['a','b']).
AFN = afn([sommet(etat(0), [arc(b, etat(0)), arc(a, etat(1))]), sommet(etat(1), [arc(b, etat(2))])], etat(0), [etat(2)]);
false.
4

0 回答 0