используя пролог для генерации предложений - PullRequest
0 голосов
/ 09 марта 2012

Рассмотрим следующий список состояний: [Sin, S2, S3, ..., Sout]

и следующие правила:

  1. можно вернуться от S (n) к S (n-1), если есть S (N-1)

  2. невозможно вернуться из S (out)

  3. предложение всегда начинается с S (in) и заканчивается S (out)

Я хотел бы иметь правило, которое можно активировать следующим образом:

 ?- 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 голосов
/ 12 марта 2012

Вот что-то, что работает:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...