このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1364700745/835
#  お願いします。 
#  [1] 授業単元:情報処理演習 
#  [2] 問題文:3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表 
#  示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表 
#  示するようにすること. 
#  

'3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表示するようにすること.' :-
        '3 つの整数a, b, s を入力として'(_a,_b,_s),
        'ax + by = s を満たす整数x, y を一組求めて'(_a,_b,_s,_x,_y),
        それらを表示する(_a,_b,_s,_x,_y),!.
'3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表示するようにすること.'(_a,_b,_s) :-
        'ただし、望みの整数x, y が存在しないときは, その旨を表示する'.

'3 つの整数a, b, s を入力として'(_a,_b,_s) :-
        整数を得る('ax+by=s のa',true,_a),
        整数を得る('ax+by=s のb',true,_b),
        整数を得る('ax+by=s のs',true,_s).

'ax + by = s を満たす整数x, y を一組求めて'(_a,_b,_s,_x,_y) :-
        _a_1 is _a * -1,
        _b_1 is _b * -1,
        for(_a_1,_x,_a),
        for(_b_1,_y,_b),
        _s is _a * _x + _b * _y.

それらを表示する(_a,_b,_s,_x,_y) :-
        write(' ax  +  by = s\n'),
        writef('%t*%t + %t*%t = %t\n',[_a,_x,_b,_y,_s]).

'ただし, 望みの整数x, y が存在しないときは, その旨を表示する' :-
        writef('望みのx,yが存在しません。\n').

for(S,N,E) :-
        E >= S,
        for_2(S,N,E).

for(S,N,E) :-
        E < S,
        for_1(S,N,E).

for_1(S,_,E) :-
        S < E,!,fail.
for_1(S,N,E) :-
        N is S.
for_1(S,N,E) :-
        S1 is S - 1,
        for_1(S1,N,E).

for_2(S,_,E) :-
        S > E,!,fail.
for_2(S,N,E) :-
        N is S.
for_2(S,N,E) :-
        S1 is S + 1,
        for_2(S1,N,E).

整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :-
        list(_催促文ならび),
        findall(_整数,(
                    member(_催促文,_催促文ならび),
                    整数を得る(Instream,_催促文,_整数を含む条件,_整数)),
                _整数ならび),!.
整数を得る(Instream,_催促文,_整数を含む条件,_整数) :-
        催促文の出力(_催促文),
        get_line(Instream,Line),
        '診断: 整数を得る'(Line,_整数を含む条件,_整数),!.
整数を得る(Instream,_催促文,_整数を含む条件,_整数) :-
        整数を得る(Instream,_催促文,_整数を含む条件,_整数).

'診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !.
'診断: 整数を得る'('',_,_) :- !,fail.
'診断: 整数を得る'(Line,_整数を含む条件,_整数) :-
        atom_to_term(Line,_整数,_),
        integer(_整数),
        '診断: 整数を含む条件'(_整数,_整数を含む条件),!.
'診断: 整数を得る'(Line,_整数を含む条件,_整数) :-
        \+((atom_to_term(Line,_整数,_),integer(_整数))),
        writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),
        fail.

'診断: 整数を得る'(end_of_file,end_of_file) :- !.
'診断: 整数を得る'('',_) :- !,fail.
'診断: 整数を含む条件'(_整数,_整数を含む条件) :-
        call(_整数を含む条件),!.
'診断: 整数を含む条件'(_整数,_整数を含む条件) :-
        writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]),
        fail.

整数を得る(_催促文,_整数を含む条件,_整数) :-
        整数を得る(user_input,_催促文,_整数を含む条件,_整数).

整数を得る(_催促文,_整数) :-
        整数を得る(user_input,_催促文,true,_整数).

整数を得る(_整数) :-
        整数を得る(user_input,'',true,_整数).

催促文の出力('') :- !.
催促文の出力(_催促文) :-
        writef('%tを入力してください : ',[_催促文]).

n個の整数を得る(_n,_催促文,_整数ならび) :-
        length(_整数ならび,_n),
        findall(_整数,(
                    部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3),
                    writef('[%t/%t]番目の',[_何番目,_n]),
                    整数を得る(_催促文,_整数)),
                _整数ならび).

一行読み込む(_行) :-
        get_line(_行).

get_line(Stream,X) :-
        get_char(Stream,C),
        get_line_1(Stream,C,Chars),
        atom_chars(X,Chars).

get_line_1(Stream,'\n',[]) :- !.
get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !.
get_line_1(Stream,C,[C|R]) :-
        get_char(Stream,C2),
        get_line_1(Stream,C2,R).


get_line(X) :-
        get_char(C),
        get_line_1(C,Chars),
        atom_chars(X,Chars).

get_line_1('\n',[]) :- !.
get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !.
get_line_1(C,[C|R]) :-
        get_char(C2),
        get_line_1(C2,R).

list([_|_]) :- !.
list([].