Comment detail

n人中m人が当選するくじ (Nested Flatten)
基本的なリスト操作述語が無いので、長たらしくなります。
リスト生成→乱打舞頭→頭から順番にN個という流れです。
randomizeは、M人分だけすれば良い気もします。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
serial(S,E,[]):-S > E.
serial(S,E,[S|R]):-succ(S,S1),serial(S1,E,R).

remove([L|Ls],1,L,Ls).
remove([],_,_,_):-fail.
remove([L|Ls],N,E,[L|R]):-succ(N1,N),remove(Ls,N1,E,R).

randomize([X],[X]).
randomize(L,R):-random(N),length(L,Ll),Nx is floor(N * Ll) + 1,remove(L,Nx,Le,Rs),randomize(Rs,Rss),R=[Le|Rss].

take(_,0,[]).
take([L|Ls],N,[L|R]):-succ(N1,N),take(Ls,N1,R).

lot(N,M,R):-serial(1,N,L0),randomize(L0,L1),take(L1,M,R).

:-lot(20,5,R),writeln(R),halt.

Index

Feed

Other

Link

Pathtraq

loading...