このディレクトリの索引
#  2と3だけを複数回かけてある数Aにもっとも近い数を作りたーい

:- dynamic('_m ^ _n'/3).

'2と3だけを複数回かけてある数Aにもっとも近い数を作る'(_ある数,_2を掛ける回数,_3を掛ける回数,_もっとも近い数) :-
        '2と3だけを複数回かけてある数Aにもっとも近い数を作る'(_ある数A,2,1,1,_現在のある数Aとの差,_2を掛ける回数,_3を掛ける回数,_ある数Aにもっとも近い数).

'2と3だけを複数回かけてある数Aにもっとも近い数を作る'(_ある数A,_組合せ数,_現在のある数Aとの差,_m,_n,_ある数Aにもっとも近い数) :-
        findall(N,(
                    for(1,N,_組合せ数)),
                L1),
        差の絶対値と差(L1,_ある数A,_m_1,_n_1,_差の絶対値,_差),
        '2と3だけを複数回かけてある数Aにもっとも近い数を作る'(_ある数A,_組合せ数,_m_1,_n_1,_差の絶対値,_差,_現在のある数Aとの差,_m,_n,_ある数Aにもっとも近い数).

'2と3だけを複数回かけてある数Aにもっとも近い数を作る'(_ある数A,_組合せ数,_m,_n,_差の絶対値,_差,_現在のある数Aとの差,_m,_n,_ある数Aにもっとも近い数) :-
        abs(_現在のある数Aとの差) =< _差の絶対値,
        _ある数Aにもっとも近い数 is _ある数A + _現在のある数Aとの差,!.
'2と3だけを複数回かけてある数Aにもっとも近い数を作る'(_ある数A,_組合せ数,_m_1,_n_1,_m,_n,_差の絶対値,_差,_現在のある数Aとの差,_ある数Aにもっとも近い数) :-
        _組合せ数の二 is _組合せ数 + 1,
        '2と3だけを複数回かけてある数Aにもっとも近い数を作る'(_ある数A,_組合せ数の二,_m,_n,_差,_ある数Aにもっとも近い数).        

差の絶対値と差(L1,_ある数A,_m,_n,_差の絶対値,_差) :-
        findmin([_差の絶対値,_差,_m,_n],(
                    総当り(L1,_m,_n),
                    Z is 2 ^ _m * 3 ^ _n,
                    _差 is _ある数A - Z),
                    _差の絶対値 is abs(_差)),
                [_差の絶対値,_差,_m,_n]),!.

総当り(L,_m,_n) :-
        member(_m,L),
        member(_n,L).