このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1392388003/31
#  [1] プログラミング言語 入門 
#  [2] 変数を入力して、入力された値と以下の条件を満たした値を表示する 
#   
#  1 : 6の倍数なら2で割った値 
#  2 : 3の倍数なら二乗した値 
#  3:  2の倍数なら2で割った値 
#  4:  上記以外の倍数は、二乗した値から元の値を引いた値 
#  ☆ 複数の条件が合致した場合は大きい倍数の条件のみとする 
#  ☆ 自作で関数を1つは作成する 
#   
#  なにとぞよろしくお願いします。 
#    
#  

'変数を入力して、入力された値と以下の条件を満たした値を表示する
1 : 6の倍数なら2で割った値
2 : 3の倍数なら二乗した値
3:  2の倍数なら2で割った値
4:  上記以外の倍数は、二乗した値から元の値を引いた値
☆ 複数の条件が合致した場合は大きい倍数の条件のみとする'(_入力された値) :-
        findall([_倍数,_条件を満たした値候補],'変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,_倍数,_条件を満たした値候補),LL),
        '☆ 複数の条件が合致した場合は大きい倍数の条件のみとする'(LL,_条件を満した値),
        表示する(_入力された値,_条件を満たした値).

'変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,6,_6の倍数なら2で割った値) :-
        '1 : 6の倍数なら2で割った値'(_入力された値,_6の倍数なら2で割った値).
'変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,3,_3の倍数なら二乗した値) :-
        2 : 3の倍数なら二乗した値'(_入力された値,_3の倍数なら二乗した値).
'変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,2,_2の倍数なら2で割った値) :-
        '3:  2の倍数なら2で割った値'(_入力された値,_2の倍数なら2で割った値).
'変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,_倍数,_二乗した値から元の値を引いた値) :-
        '4:  上記以外の倍数は、二乗した値から元の値を引いた値'(_入力された値,_倍数,_二乗した値から元の値を引いた値).

'1 : 6の倍数なら2で割った値'(_入力された値,_2で割った値) :-
        '6の倍数なら'(_入力された値),
        '2で割った値'(_入力された値,_2で割った値).

'6の倍数なら'(_入力された値) :-
        0 is _入力された値 mod 6.

'2で割った値'(_入力された値,_2で割った値) :-
        _2で割った値 is _入力された値 // 2.

'2 : 3の倍数なら二乗した値'(_入力された値,_二乗した値) :-
        '3の倍数なら'(_入力された値),
        二乗した値(_入力された値,_二乗した値).

'3の倍数なら'(_入力された値) :-
        0 is _入力された値 mod 3.

二乗した値(_入力された値,_二乗した値) :-
        _二乗した値 is _入力された値 ^ 2.

'3:  2の倍数なら2で割った値'(_入力された値,_2で割った値) :-
        '2の倍数なら'(_入力された値),
        '2で割った数'(_入力された値,_2で割った値).

'2の倍数なら'(_入力された値) :-
        0 is _入力された値 mod 2.

'2で割った値'(_入力された値,_2で割った値) :-
        _2で割った値 is _入力された値 // 2.

'4:  上記以外の倍数は、二乗した値から元の値を引いた値'(_入力された値,_倍数,_二乗した値から元の値を引いた値) :-
        '上記以外の倍数は、'(_入力された値,_倍数),
        二乗した値から元の値を引いた値(_入力された値,_二乗した値から元の値を引いた値).

'上記以外の倍数は、'(_入力された値,_倍数) :-
        between(1,_入力された値,_倍数),
        \+(0 is _倍数 mod 6),
        \+(0 is _倍数 mod 3),
        \+(0 is _倍数 mod 2),
        0 is _入力された値 mod _倍数.

二乗した値から元の値を引いた値'(_入力された値,_二乗した値から元の値を引いた値) :-
        _二乗した値から元の値を引いた値 is _入力された値 ^ 2 - _入力された値.

'☆ 複数の条件が合致した場合は大きい倍数の条件のみとする'(LL,_条件を満たした値) :-
        最大値(LL,[_最も大きい倍数,_条件を満たした値]).

表示する(_入力された値,_条件を満たした値) :-
        writef('入力された値=%t,条件を満たした値=%t\n',[_入力された値,_条件を満たした値]).

最大値([A|R],_最大値) :-
        最大値([A|R],A,_最大値),!.

最大値([],_最大値,_最大値).
最大値([A|R],B,_最大値) :-
        A @> B,
        最大値(R,A,_最大値).
最大値([A|R],B,_最大値) :-
        A @=< B,
        最大値(R,B,_最大値).