【问题标题】:Automata and prolog自动机和序言
【发布时间】:2020-04-21 16:08:15
【问题描述】:

我一直在尝试在 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)) 接受时,我得到了正确的结果,即不对。

【问题讨论】:

标签: prolog finite-automata


【解决方案1】:

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

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)]

【讨论】:

  • 我假设您在转换中的状态编号有错误,但证明顺序如我所述
  • 谢谢,以后我会使用你个人的最佳实践。 :p
  • @Mystery:出于好奇,我对转换的假设是正确的吗?如果是这样,预期的定义是什么?
猜你喜欢
  • 1970-01-01
  • 2019-12-25
  • 2011-05-17
  • 2016-10-04
  • 2019-01-13
  • 2014-03-25
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
相关资源
最近更新 更多