Перечисление подсписка с прологом - PullRequest
3 голосов
/ 13 марта 2012

Я пытаюсь написать программу для пролога, которая ведет себя следующим образом: он перечисляет все возможные последовательные (я не уверен, что это правильная фраза, то есть [a, c] не является подсписком [a, b, c]), подсписки, длина подсписка, расстояние от первого элемент соответствующего списка до первого элемента подсписка и расстояние от последнего элемента подсписка до последнего элемента правильного списка. Поэтому в идеале ввод / вывод должен выглядеть примерно так:

| ?- sublist([a,b], SubList, Before, Len, After).
    SubList= [], After = 2, Before = 0, Len = 0 ? ;
    SubList= [a], After = 1, Before = 0, Len = 1 ? ;
    SubList= [a,b], After = 0, Before = 0, Len = 2 ? ;
    SubList= [], After = 1, Before = 1, Len = 0 ? ;
    SubList= [b], After = 0, Before = 1, Len = 1 ? ;
    SubList= [], After = 0, Before = 2, Len = 0 ? ;

Пока что я могу правильно вывести подсписки и вывести их длины, вот так:

sublist(L,S,Len) :-
    append(_,L2,L), %getting sublist
    append(S,_,L2), %getting sublist
    length(S,Len).  %getting length of sublist

но мне трудно понять, как я могу отслеживать «До» и «После». Казалось, что (возможно, подлый?) Способ сделать это - начать B с -1 и увеличивать «До» на 1 каждый раз, когда встречается [] -значный подсписок (поскольку встреча с [] означает, что голова была удалены, и теперь мы начинаем заново только с хвоста), и когда у вас есть «До», «После» будет просто ([длина списка ввода] - «До» - [длина подсписка]) , К сожалению, я в полной растерянности относительно того, как мне пойти на увеличение «До». Какие-нибудь мысли? Спасибо! :)

1 Ответ

3 голосов
/ 13 марта 2012

Пока я могу правильно выводить подсписки и выводить их длины, например, [...]

Ты почти понял.

Просто привяжите префикс и суффикс к переменным и убедитесь, что длина префикса равна Before, а длина суффикса равна After:

sublist_lengths(L, SubList, Before, Len, After) :-
    append(PrefSub, Suffix, L),
    append(Prefix, SubList, PrefSub),
    length(SubList, Len),
    length(Prefix, Before),
    length(Suffix, After).
...