「prolog勉強プロジェクトオイラー51~60」の編集履歴(バックアップ)一覧に戻る
prolog勉強プロジェクトオイラー51~60」を以下のとおり復元します。
*問い51
http://projecteuler.net/problem=51
Prologには破壊的代入もなければ配列もstd::mapすらない。
リストで擬似的な11分木を構築して解いてみたけれど何か速度が出ない。
計算量の問題なのか、木を分解したり結合しなおしたりする作業が悪いのか?


 nums([a,0,1,2,3,4,5,6,7,8,9]).
 notPrime(N):-N<2,!.
 notPrime(N):-
 	sqrt(N,N1),
 	N2 is floor(N1),
 	between(2,N2,N3),
 	0=:=N mod N3,
 	!.
 isPrime(N):-not(notPrime(N)).
 add_a(X,[N|X]):-nums(A),
 	member(N,A).
 add_list(List,[Y,X]):-
 	nums(A),
 	member(X,List),
 	member(Y,A).
 create_tree(6,[0,0]):-!.
 create_tree(N,Result):-
 	N1 is N+1,
 	findall(L,create_tree(N1,L),Re),
 	findall(L,add_list(Re,L),Result).
 
 tree_add(_,M,[X,Y],[Re,Y1]):-
 	integer(X),
 	integer(Y),
 	!,
 	Y1 is Y+1,
 	((X=:=0;M<X)->
 	Re is M;
 	Re is X).
 tree_add([],M,[[0,Rest]|Rest1],[[0,Result]|Rest1]):-
 	!,
 	tree_add([],M,Rest,Result).
 tree_add([N|NumRest],M,[[N,Rest]|Rest1],[[N,Result]|Rest1]):-
 	!,
 	tree_add(NumRest,M,Rest,Result).
 tree_add(NumList,M,[[N,Rest]|Rest1],[[N,Rest]|Result]):-
 	tree_add(NumList,M,Rest1,Result).
 
 num_to_list(0,_,[]):-!.
 num_to_list(N,R,[a|Result]):-
 	R =:= N mod 10,
 	N1 is N//10,
 	num_to_list(N1,R,Result).
 num_to_list(N,R,[M|Result]):-
 	M is N mod 10,
 	N1 is N//10,
 	num_to_list(N1,R,Result).
 
 check(List):-member(a,List),!.
 
 perms(N,Result):-
 	between(0,9,R),
 	num_to_list(N,R,Result),
 	check(Result).
 
 tree_adds(N,[],Tree):-!,search(N,Tree).
 tree_adds(N,[L|List],Tree):-
 	N1 is N-1,
 	tree_add(L,N1,Tree,NextTree),
 	!,
 	tree_adds(N,List,NextTree).
 
 
 tree_search([X,8]):-
 	integer(X),
 	!,
 	write([X,8]).
 tree_search([[_,Rest]|Rest1]):-
 	member(X,[Rest,Rest1]),
 	tree_search(X).
  
 search(1000000,Tree):-!,tree_search(Tree).
 search(N,Tree):-
 	notPrime(N),
 	!,
 	N1 is N+1,
 	search(N1,Tree).
 search(N,Tree):-
 	findall(L,perms(N,L),List),
 	N1 is N+1,
  	!,
  	tree_adds(N1,List,Tree).
 main51:-create_tree(0,Tree),search(1,Tree).

復元してよろしいですか?