How does this compute ? I am trying to understand how the values of H get assigned in the list

你离开我真会死。 提交于 2020-01-04 05:20:49

问题


This predicate should print a list of size N containing possible permutations of 0 and 1.

My question is : does the value of H get carried over with each recursion or does the creation of the list with values of bit(H) take place in the backtracking phase?

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

回答1:


Prolog execution is all about choice points. Here a choice point is left at each recursion step by the bit/1 predicate. When you ask Prolog to give you another solution, it will just go back to the youngest choice point. Here, instead of going through the first clause of bit/1 and bind H to 0, it will go through the second clause and bind H to 1. Once both clauses have been picked, Prolog'll go back to an older choice point, etc... until ultimately all choice points are exhausted and the program returns false..

you can try this yourself with the trace/0 predicate:

?- trace, gen(3, Result).



回答2:


May I offer you a more straight forward definition first:

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

In this definition all recursive parts are now hidden in some built-ins. The first goal ensures that Xs is a list of length N. And the next goal ensures that each element is between 0 and 1. If you look at the answers, you will realize in what order the solutions are enumerated:

?- 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] ; ...



回答3:


This predicate generates all numbers (with order) in binary system well to understand it you must understand prolog backtracking, you coudl draw some substitution tree to understand it



来源:https://stackoverflow.com/questions/9980581/how-does-this-compute-i-am-trying-to-understand-how-the-values-of-h-get-assign

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!