2015-04-04 2 views
2

Это как условие выглядитКак Prolog оценивает этот пункт?

splits(L, ([],L)). 
splits([X|L],([X|S],E)):- splits(L, (S,E)). 

расколов следует разделить список L на две части в каждой возможной точке и должна вернуть все возможности. Возможный запрос:
разделов ([1,2,3], Res).

Результатом является

Res = ([], [1,2,3]); 
Res = ([1], [2,3]); 
Res = ([1,2], [3]); 
Res = ([1,2,3], []); 
No 

Моя проблема в том, что я не понимаю, как расщепляется работу. Я записал это для вышеупомянутого случая, но все же я не знаю. Я был бы признателен, если бы кто-нибудь мог мне это объяснить.

+0

Что вы не понимаете? –

+0

@PaulButcher: Я не понимаю, как это работает. Я написал это шаг за шагом, но я не знаю, как производится * Res *. – tumbler

+0

@PaulButcher: для экземпляров S и E довольно запутывают. – tumbler

ответ

2

Чтобы лучше понять, сначала попробуйте использовать некоторые более описательные (или, по крайней мере, обычные) имена переменных:

splits(L, ([], L)). 
splits([Head|Tail], ([Head|Tail2], Remainder)):- 
    splits(Tail, (Tail2, Remainder)). 

Итак, ваша первая версия Res, где он расщепляется до нулевого элемента, должен быть Очевидно: это пустой список и весь список, и он соответствует первому предложению.

Для последующих результатов Prolog отступает, пока не найдет альтернативный маршрут, который он не принял раньше. Учитывая, что [1,2,3] - это список с головой и хвостом, он соответствует [Head|Tail] в другом предложении. Head - 1, и Tail - [2,3].

Итак, теперь мы снова обходим последовательность, но на этот раз с [2,3] в качестве первого аргумента. В первом случае привязка (Tail2, Reminder) к ([], [2,3]), что означает, что ([Head|Tail2], Remainder) (т. Е. Res, в вашем запросе), поэтому связывается с ([1 | []],[2,3]). [1|[]] всего лишь [1]. Итак, вы получите свой второй ответ.

Последующие результаты затем производятся таким же образом, выбирая другое предложение каждый раз, когда происходит обратное отслеживание.

Смежные вопросы