Как это вычислить?Я пытаюсь понять, как значения H назначаются в списке - PullRequest
2 голосов
/ 02 апреля 2012

Этот предикат должен выводить список размером N, содержащий возможные перестановки 0 и 1.

Мой вопрос: переносится ли значение H с каждой рекурсией илипроисходит ли создание списка со значениями bit(H) на этапе возврата?

bit(0).
bit(1).
gen(0,[]).
gen(N,[H|T]) :-
   N > 0,
   bit(H),
   N1 is N - 1,
   gen(N1,T).

Ответы [ 3 ]

2 голосов
/ 02 апреля 2012

Позвольте мне сначала предложить вам более простое определение:

gen(N, Xs) :-
   length(Xs, N),
   maplist(between(0,1), Xs).

В этом определении все рекурсивные части теперь скрыты в некоторых встроенных модулях.Первая цель гарантирует, что Xs является списком длины N.И следующая цель гарантирует, что каждый элемент находится между 0 и 1. Если вы посмотрите на ответы, вы поймете, в каком порядке перечислены решения:

?- gen(4, Xs).
Xs = [0,0,0,0] ;
Xs = [0,0,0,1] ;
Xs = [0,0,1,0] ;
Xs = [0,0,1,1] ;
Xs = [0,1,0,0] ;
Xs = [0,1,0,1] ;
Xs = [0,1,1,0] ; ...
2 голосов
/ 02 апреля 2012

Выполнение Пролога - все о точках выбора. Здесь точка выбора остается на каждом шаге рекурсии предикатом bit/1. Когда вы попросите Пролог дать вам другое решение, оно просто вернется к самой молодой точке выбора. Здесь вместо того, чтобы проходить через первое предложение bit/1 и связывать H с 0, оно будет проходить через второе предложение и связывать H с 1. Как только оба предложения будут выбраны, Prolog вернется к более старой точке выбора и т. Д., Пока в конечном итоге все точки выбора не будут исчерпаны и программа не вернет false..

вы можете попробовать это сами с предикатом trace/0:

?- trace, gen(3, Result).
0 голосов
/ 02 апреля 2012

Этот предикат генерирует все числа (с порядком) в двоичной системе, чтобы понять его, вы должны понимать, что вводный пролог отслеживает, вы должны нарисовать какое-то дерево подстановок, чтобы понять его

...