使用prolog生成句子

时间:2012-03-08 20:54:36

标签: prolog

考虑以下状态列表:     [仙,S2,S3,...,SOUT]

并遵循以下规则:

  1. 如果存在,则可以从S(n)返回到S(n-1) S(N-1)

  2. 无法从S(out)

  3. 返回
  4. 一个句子总是以S(in)开头,以S(out)结尾

  5. 我希望有一个可以像这样激活的规则:

     ?- sentence(X, backs)
    

    其中'后退'表示允许“后退”的次数。

    对于此列表[a,b,c,d]

     ?- sentence(x, 2)
    

    将生成:

    [a,b,c,d] %no backs
    [a,b,a,b,c,d] %one back
    [a,b,c,b,c,d] %from d we cannot go back
    [a,b,a,b,c,b,c,d] %two backs
    [a,b,c,b,a,b,c,d] %two backs
    

1 个答案:

答案 0 :(得分:0)

这似乎有效:

sentence( [A|B], N, [A|X]) :- B=[_|_] -> sentence(B,[A],N,X) 
                                      ;  B = X.
sentence( B, _, 0, B).                  % no more moves back left
sentence( [B,C], _, N, [B,C]):- N>0.    % no going back from end node
sentence( [B|C], A, N, [B|X]):- N>0, C=[_|_],             
                                sentence( C, [B|A], N, X).      $ fore
sentence( [B|C], [A|D], N, [B|X]):- N>0, C=[_|_], N1 is N-1, 
                                sentence( [A,B|C], D, N1, X).   $ aft

运行它给了我

23 ?- sentence([a,b,c,d],2,X).
X = [a, b, c, d] ;
X = [a, b, c, b, c, d] ;
X = [a, b, c, b, c, b, c, d] ;
X = [a, b, c, b, a, b, c, d] ;
X = [a, b, a, b, c, d] ;
X = [a, b, a, b, c, b, c, d] ;
X = [a, b, a, b, a, b, c, d] ;
No