10/07/24 06:52:07
>>320
% Prolog
'1から100の数字の中から素数を抽出する (配列に直接数字を指定することは不可)-抽出した素数を大きい順(降順)にソートする-ソートした素数を1行につき5個表示する(6個目以降は次の行に表示する)' :-
'1から100の数字の中から素数を抽出する'(L1),
'抽出した素数を大きい順(降順)にソートする'(L1,L2),
'ソートした素数を1行につき5個表示する'(L2).
'1から100の数字の中から素数を抽出する'(L1) :- findall(M,for(2,M,N),L),'エラトステネスの篩'(L,L1),!.
'抽出した素数を大きい順(降順)にソートする'(L1,L2) :- sort(L1,L3),reverse(L3,L2).
'ソートした素数を1行につき5個表示する'(L) :-
'5個切り取り表示'(L,R),
length(R,Len),
Len < 5,
'最終行は5個に満たないかもしれない(R),!.
'5個切り取り表示'(R,R) :- length(R,Len),Len < 5,!.
'5個切り取り表示'(L,R) :-
'N個組'(5,L,X,R),
concat_atom(X,' ',S1),
write_formatted('%t\n',[S1]).
'N個組'(N,L,X,R) :-
length(X,N),
append(L0,X,R,L),
length(L0,Len1),
0 is Len1 mod N.
最終行は5個に満たないかもしれない(R) :- concat_atom(R,' ',S),write_formatted('%t\n',[S]).