
:- use_module(library(clpq)).

% dilemma(+M,-Max)
% Sor ara 200Ft es 8 boldogsagpontot nyujt.
% Zsiroskenyer ara 100Ft es 1 boldogsagpontot nyujt.
% Viszont a sor csak akkor esik jol, ha legalabb feleannyi
% zsiroskenyeret is megeszunk hozza.
% M Forinttal a zsebunkben, Max db boldogsagpontot tudunk
% osszegyujteni legfeljebb.
dilemma(M,Max):-
	{B = -1*(K + 8*S)},
	{S =< 2*K},
	{200*S + 100*K =< M},
	bb_inf([S,K],B,Inf),
	{Max = -1* Inf}.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Hamming problema
% hamming(N,H):-
% H lista az elso olyan N > 1 szamot tartalmazza novekvo sorrendben,
% amelyek primtenyezoi kozott csak 2 es 3 szerepel.
hamming(N,H):-
        U=[1|H], 
        times(U,2,X), 
        times(U,3,Y), 
        merge(X,Y,Z),
        prefix(N,Z,H).

% times(X,M,Z):- A Z lista az X elemeinek M-szerese
:- block times(-,?,?).
times([],_,[]).
times([A|X],M,Z):-
        freeze(A, (
                    B is M*A,
                    Z = [B|U],
                    times(X,M,U)
                  )
              ).

:- block merge(-,?,?), merge(?,-,?).
merge([A|X],[B|Y],V):-
        when( (nonvar(A),nonvar(B)),
              ( A < B -> V = [A|Z], merge(X,[B|Y],Z)
              ; B < A -> V = [B|Z], merge([A|X],Y,Z)
              ; V = [A|Z], merge(X,Y,Z)
              )
            ).
merge([],X,X):- !.
merge(X,[],X).

% prefix(N,X,Y):- Az X lista elso N eleme Y.
prefix(0,_,[]):- !.
prefix(N,[A|X],[A|Y]):-
        N > 0, N1 is N-1, prefix(N1,X,Y).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


% +(A,B,C): A es B diszjunkcioja C
:- op(300, yfx, +).

%---------------------------------------------------------

% sat(Kif):-
% Kif egy Kif1 = Kif2 kifejezes, melyben a ket oldalon levo
% kifejezesek valtozokbol illetve 0 es 1 konstansokbol a + operator
% segitsegevel epitett kifejezesek.
