prolog - 自动机和序言

标签 prolog finite-automata

我一直在尝试在 PROLOG 中制作一个非确定性有限自动机,这是我的代码:

state(1).
state(2).
state(3).

initial_state(1).
final_state(3).

alphabet(a).
alphabet(b).

delta(1, b, 2).
delta(2, a, 2).
delta(2, a, 3).
delta(3, b, 2).

accept([X|[]], Q) :- 
    alphabet(X),
    delta(Q, X, Q1),
    final_state(Q1).
accept([X|XS], Q) :- 
    alphabet(X),
    delta(Q, X, Q1),
    accept(XS, Q1).

其中accept是一个给定字符串和状态的函数,它会告诉我们自动机是否接受它。 问题是,当我尝试查看字符串 baba ([b,a,b,a]) 是否被自动机接受时 (accept([b,a,b,a],1)) 我得到 true,这不对。

最佳答案

你认为它为什么会失败? 解题顺序为

delta(1, b, 2)
delta(2, a, 3)
delta(2, a, 2)
delta(2, a, 3)

我个人的“最佳实践”是收集证据

accept([X|[]], Q,[delta(Q, X, Q1)]) :- 
    alphabet(X),
    delta(Q, X, Q1),
    print(delta(Q, X, Q1)),nl,
    final_state(Q1).
accept([X|XS], Q,[delta(Q, X, Q1)|Rest]) :- 
    alphabet(X),
    delta(Q, X, Q1),
    print(delta(Q,X,Q1)),nl,
    accept(XS, Q1,Rest).
accept(String,State):-accept(String,State,_).

这表明该程序可以通过上述序列进行校对

?- accept([b,a,b,a],1, Proof).
Proof = [delta(1, b, 2), delta(2, a, 3), delta(3, b, 2), delta(2, a, 3)]

关于prolog - 自动机和序言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61347949/

相关文章:

prolog - 使用Prolog获取列表中偶数的最长子序列

regex - 我如何构建这个有限自动机?

algorithm - 多重模式匹配算法

prolog - CLPFD 和无限可数域

regex - 可以使用正则表达式来匹配嵌套模式吗?

javascript - v8/firefox RegExp 实现是基于有限自动机还是递归回溯?

coq - 定义有限自动机 Coq

prolog - 如何确定两个命题公式在 Prolog 中是否等价?

prolog - 在到达预期节点之前,如何知道图中的所有节点是否已被访问?

lambda - Prolog:foreach 还是 forall 用于约束求解?