我在序言中有以下代码,我希望能够在变量出现时对其进行测试:
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.