用prolog生成句子

用prolog生成句子,prolog,Prolog,考虑下列国家名单: [Sin,S2,S3,…,Sout] 以及以下规则: 如果存在这样的情况,可以从S(n)返回到S(n-1) S(n-1) 无法从S(out)返回 句子总是以S(in)开头,以S(out)结尾 我希望有一个规则可以像这样激活: ?- sentence(X, backs) 其中“backs”表示允许“back”的次数 对于此列表[a、b、c、d] ?- sentence(x, 2) 将产生: [a,b,c,d] %no backs [a,b,a,b,c,d] %one b

考虑下列国家名单: [Sin,S2,S3,…,Sout]

以及以下规则:

  • 如果存在这样的情况,可以从S(n)返回到S(n-1) S(n-1)

  • 无法从S(out)返回

  • 句子总是以S(in)开头,以S(out)结尾

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

     ?- sentence(X, backs)
    
    其中“backs”表示允许“back”的次数

    对于此列表[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
    

    以下是一些似乎有效的方法:

    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
    

    您的问题,如当前所述,将返回1,如果列表只有两个项目,否则返回无限。例如,如果它有3个元素(a,b,c),你可以形成(a,b,c),(a,b,a,b,c),(a,b,a,…,c),其中。。。是任意数量的(b,a)子序列。查询中应有约束。使用“backs”参数,我希望控制返回的次数。这会使它变得有限。那么你觉得这里的任何答案都有帮助吗,值得投票和接受吗?@AdrianHerscu从你的描述来看,不清楚是否允许从
    S2
    移回
    Sin
    。我的代码和您的示例都像是被允许的一样运行。如果没有,只需做
    go([A | B],N[A | B2]):-句子(B,N,B2)。