このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1245853701/929
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# 主語、目的語、述部が入ったデータファイルを読み込み、それらをランダムに
# 組み合わせて生成した短文を20個ファイルに出力するプログラムの作成。
# 短文の構文は必ず、「(主語)は、(目的語)(述部)。」となるようにする。
#
# 出力例:俺は、カレーが大好きだ。
#
# データファイルは以下を使用すること。
# 主語: 俺 私 あなた 彼 彼女 先生 犬のポチ 猫のタマ ライオン
# その人 政治家 ネズミ  の12個
# 目的語: カレー ご飯 肉 授業 男 女 すごいもの アレ アンパン
# お金  の10個
# 述部: が大好きだ が大嫌いだ を作った をなくした が欲しい
# に全力を尽くす を新しいものに交換した ?なにそれ美味いの?
# について深く考えた を捨てた に塩をふりかけた の11個 
% 入力データファイル: http://nojiriko.asia/prolog/t440_1.txt
% 出力データファイル: http://nojiriko.asia/prolog/t440_2.txt

t440 :-
    get_lines('t440_1.txt',Lines),
    構造定義(Lines),
    findall(_語ならび,表示文(_語ならび,[]),_語ならび集),
    '20文をランダムに選択して表示'(_語ならび集).

表示文(_語ならび,R) :- 主部(_語ならび,R1),読点(R1,R2),目的語(R2,R3),述部(R3,R4),句点(R4,R).

主部(L,R) :- 主語(L,R1),後置詞(R1,R).
後置詞(['は'|R],R).
読点(['、'|R],R).
句点(['。'|R],R).

構造定義(Lines) :-
    member(_行,Lines),
    split(_行,[':',':',' ',' '],[F|L2]),
    append(L3,[_],L2),
    要素定義(F,L3),
    fail;
    true.

要素定義(F,L) :-
    member(A,L),
    P =.. [F,[A|R],R],
    assertz(P),
    fail;
    true.

'20文をランダムに選択して表示'(_語ならび集) :-
    length(_語ならび集,Len),
    tell('t440_2.txt'),
    重複しない20文をランダムに選択表示(20,_語ならび集,Len,[]).
    told.

重複しない20文をランダムに選択表示(0,_,_,_) :- !.
重複しない20文をランダムに選択表示(N,_語ならび集,Len,_選択したnthならび) :-
    Nth is random mod Len + 1,
    not(member(Nth,_選択したnthならび)),
    list_nth(Nth,_語ならび集,_選択した語ならび),
    concat_atom(_選択した語ならび,_選択文),
    write_formatted('%t\n',[_選択文]),
    M is N - 1,
    重複しない20文をランダムに選択表示(M,_語ならび集,Len,[Nth|_選択したnthならび]),!.
重複しない20文をランダムに選択表示(N,_語ならび集,Len,_選択したnthならび) :-
    重複しない20文をランダムに選択表示(N,_語ならび集,Len,_選択したnthならび).