Ha már a konzultáción nem tudtam ott lenni, legalább a múltkori vizsgasornak
nekiestem. Az email további részében az első négy feladat megoldása
következik (az ötödik még folyamatban), az én elképzeléseim szerint
helyesen. Ha ez nem így volna, nagyra értékelném, ha az illetékesek (akár a
tanár úr, akár azok, akik épp ezt a vizsgát írták) kiigazítanának.
~ Gyuri
----- 1. -----
:- use_module(library(clpb)).
egymeg(M, V, X) :-
solve_eqs(M, V, X).
solve_eqs([],[],_).
solve_eqs([M|RestM], [V|RestV], X) :-
solve_eq(M, V, X),
solve_eqs(RestM, RestV, X).
solve_eq(A, V, X) :-
solve_eq_acc(A,X, S),
{S = V}.
solve_eq_acc([A1], [X1], A1*X1) :- !.
solve_eq_acc([A1|As],[X1|Xs], A1*X1+Ss) :-
solve_eq_acc(As, Xs, Ss).
----- 2. -----
:- use_module(library(clpb)).
szep([L|Ls]) :-
L = 0,
apply_cons([L|Ls]).
apply_cons([X1,1]) :-
sat(card([0-1],[X1])).
apply_cons([X1,X2,X3|RestX]) :-
sat(card([1-2],[X1,X2,X3])*card([1-2],[X1,X2])),
apply_cons([X2,X3|RestX]).
----- 3. -----
:- use_module(library(clpfd)).
% (X >= 0) => Y > 0
pred(X, Y) +:
Y in (min(X)..0)?(inf..sup) \/(1..sup),
X in (0..max(Y))?(inf..sup) \/(inf..0).
% (X >= 0) => Y > 0 === FALSE <==> (X >=0) & Y <= 0
pred(X, Y) -?
Y in (0..min(X))? (inf..0).
----- 4. -----
:- use_module(library(clpfd)).
metszo(L, N, M) :-
make_doms(L, Doms),
fd_global(metszo(L, N, M), L, Doms).
make_doms([],[]).
make_doms([X|Xs], [dom(X)|Ds]) :-
make_doms(Xs, Ds).
:- multifile clpfd:dispatch_global/4.
:- discontiguous clpfd:dispatch_global/4.
clpfd:dispatch_global(metszo(_, N, M), L, NewL, Actions) :-
dispatch_metszo(L, N, M, NewL, Actions).
dispatch_metszo(L, N, M, NewL, Actions) :-
fdset_interval(Target, N, M),
process_list(L, Target, NewL, Succ),
( NewL == [] -> Actions = [fail]
; Succ == succ -> Actions = [exit]
; NewL = [X] -> Actions = [X in N..M]
; Actions = []
).
process_list([], _, [], nothing).
process_list([X|Xs], Target, NewL, Succ) :-
fd_set(X, XSet), fdset_complement(Target, NotTarget),
fdset_intersection(XSet, Target, InsideT),
fdset_intersection(XSet, NotTarget, OutsideT),
( empty_fdset(OutsideT) -> Succ = succ, NewL = [X|RestL]
; empty_fdset(InsideT) -> NewL = RestL, process_list(Xs, Target, RestL,
Succ)
; NewL = [X|RestL], process_list(Xs, Target, RestL, Succ)
).
----- END -----