Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog列表表示图遍历_Prolog_Finite Automata_Transitive Closure - Fatal编程技术网

Prolog列表表示图遍历

Prolog列表表示图遍历,prolog,finite-automata,transitive-closure,Prolog,Finite Automata,Transitive Closure,我试图遍历我在prolog中构建的一个图。图形表示为表单的转换列表: 接下来(FromState、ToState、Symbol),其中FromState和ToState是图形的节点,表示为:state(Number,无关变量)。符号可以取很多值,但我只对以ε为符号的变换感兴趣。给定一组StartState,我需要查看FromState=StartState和Symbol=epsilon的转换。如果这两个条件为真,我会将ToState添加到end StartState,并将FromState添加到

我试图遍历我在prolog中构建的一个图。图形表示为表单的转换列表: 接下来(FromState、ToState、Symbol),其中FromState和ToState是图形的节点,表示为:state(Number,无关变量)。符号可以取很多值,但我只对以ε为符号的变换感兴趣。给定一组StartState,我需要查看FromState=StartState和Symbol=epsilon的转换。如果这两个条件为真,我会将ToState添加到end StartState,并将FromState添加到已访问节点的列表中。我很难做到这一点,我目前的计划是不工作的原因。你知道为什么它不起作用吗?问题之一似乎是,当我使用成员谓词查看我是否访问了列表顶部的状态时,它最终统一为使成员谓词为true,而不是在第一次调用espsilon_closure_helper3时实际检查VISTER for Head

epsilon_closure_helper3([], [Transitions], Visited).

epsilon_closure_helper3([Head|Tail], Transitions, Visited) :-
  member(Head, Visited)
  ->
  epsilon_closure_helper2(Tail, Transitions, Visited)
  ;
  epsilon_closure_helper2(Head, Transitions, ClosureStates1),
  append(Tail, ClosureStates1, Tail1),
  sort(Tail1, Tail2),
  append(Vistited, [Head], Visited1),
  epsilon_closure_helper3(Tail2, Transitions, Visited1).


epsilon_closure_helper2(State, [], States) :-
  States = [State].

epsilon_closure_helper2(State, Transitions, States) :-
   Transitions = [Head|Tail],
   epsilon_closure_helper2(State, Tail, States1),
   Head = next(A, B, Symbol),
   (
   test_state(State, A, Symbol) -> append(States1, [B], States) ; 
   States = States1
   ).

  test_state(TargetState, State, Symbol) :-
    State = TargetState,
    Symbol = epsilon.
样本输入: epsilon_closure_helper3([状态(0,iv)],[下一步(状态(0,iv),状态(1,iv),epsilon),下一步(状态(1,iv),状态(2,iv),epsilon]访问,结束)

输出:
闭包=[状态(0,iv),状态(1,iv),状态(2,iv)]

我知道结构与问题中给出的不同,但我也知道您是学生,需要理解和学习代码,因此这里有一个解决方案,它不使用与您相同的结构,但应该可以帮助您学习和完成作业

图表是从这个

请注意,代码没有任何
附加/3
排序/2
=/2
->/2

示例运行:

?- epsilon_closure(a,States).
States = [a].

?- epsilon_closure(b,States).
States = [b, a].

?- epsilon_closure(c,States).
States = [c, b, a].

问题是什么?@DanielLyons我的程序现在还没有运行。你知道为什么吗?@DanielLyons你知道我如何解决成员谓词的问题,以阻止它在递归的第一次迭代中与访问列表统一吗?我在上面加了一点解释。你的输入和输出必须与你的输入和输出完全相同吗这是你的问题,因为它是一个作业,或者它可以改变吗?我很确定我从你写的东西中理解了这个作业,但是我发现你的结构有点混乱。有趣的是:Rosetta代码-在Prolog中。虽然我还没有尝试过它,但通过改变bagof likebagof(开始,转换),代码可能会进一步优化(开始,结束状态,epsilon),开始)然后从那里重构。@jewelltaylor9430如果你自己解决了这些问题,那么你应该把它们作为一个额外的答案发布出来,1)帮助发现这个问题的其他人,2)为自己赢得分数。对一个问题投赞成票得5分,但对一个答案投赞成票得10分。@jewelltaylor9430你可以做的另一件事是将你的代码发布到,并获得关于你可以做哪些更改的提示。不幸的是,由于它与学校有关,我不希望其他学生能够看到我的答案it@jewelltaylor9430理解,但他们已经看到了我的答案。你还是应该在几个月后发布它。
?- epsilon_closure(a,States).
States = [a].

?- epsilon_closure(b,States).
States = [b, a].

?- epsilon_closure(c,States).
States = [c, b, a].