Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
not_in(X,[]).
not_in(X,[Y|W]) :- X != Y, not_in(X,W).
b(0, []).
b(X, [Z|W]) :- X is Y + 1, b(Y,W), a(Z), not_in(Z,W)!.
first(X,[X|Y]).
subset([], X).
subset([X|Y],[Z|W]) :- X=Z, subset(Y,W).
subset(X,[Y|Z]) :- subset(X, Z).
subset2([X|Y],[Z|W]) :- X=Z, subset(Y,W).
subset_a([]).
subset_a(X) :- integer(N), b(N, Z), subset2(X, Z).
b(0, []).
b(X, [Z|W]) :- X is Y - 1, b(Y, W), a(Z), not(member(Z, W)), !.
subset([], X).
subset([X|Y],[X|W]) :- subset(Y,W).
subset(X,[_|Z]) :- subset(X, Z).
%% ints - not standard predicate,
%% generates all numbers start from 0
subset_a([]).
subset_a([NthEl|RestSubset]) :- ints(N), b(N, [NthEl|Rest]), subset(Rest, RestSubset).
ints(0).
ints(X) :- ints(Y), X is Y + 1.
sub_set([], []).
sub_set([X|Y],[X|W]) :- sub_set(Y,W).
sub_set(X,[_|Z]) :- sub_set(X, Z).
a(1).
a(2).
a(3).
% a(X) :- ints(X).
set_a(0, []).
set_a(X, [Z|W]) :- Y is X - 1, Y >= 0, set_a(Y, W), a(Z), not(member(Z, W)), !.
subset_a([]).
subset_a([NthEl|RestSubset]) :- ints(N), set_a(N, [NthEl|Rest]), sub_set(RestSubset, Rest).
a(b).
a®.
a(d).
a(e).
sub_set([], []).
sub_set([X|Y],[X|W]) :- sub_set(Y,W).
sub_set(X,[_|Z]) :- sub_set(X, Z).
subset_a([]).
subset_a(XS) :- a(L), a®, middle(L, R, Z), sub_set(X, Z), uni([L|X], [R], XS).
middle(X, X, []) :- !.
middle(X, Y, Middle) :- before(X, XB), before(Y, YB), member(X, YB), diff(YB, [X|XB], Middle).
before(X, Y) :- before(X, [], Y).
before(X, E, Y) :- a(XB), not(member(XB, E)), !, fringe(X, XB, E, Y).
fringe(X, X, E, E) :- !.
fringe(X, XB, E, Y) :- before(X, [XB|E], Y).
diff(X, [], X) :- !.
diff([], _, []) :- !.
diff([X|XS], Y, [X|YS]) :- not(member(X, Y)), !, diff(XS, Y, YS).
diff([_|XS], Y, YS) :- diff(XS, Y, YS).
uni(X, [], X) :- !.
uni([], X, X) :- !.
uni([X|XS], Y, [X|YS]) :- not(member(X,Y)), !, uni(XS, Y, YS).
uni([_|XS], Y, YS) :- uni(XS, Y, YS).
Prolog — примеры использования (Часть 2)