:- prompt(_, '').
:- use_module(library(readutil)).
% set membership with non-pure builtin \==
% to cut down duplicate answers as sets
memb(X,[X|_]).
memb(X,[Y|L]) :- X \== Y, memb(X,L).
% unify finite sets (i.e. set with [] at the end)
unify_set(A,B) :- subset_of(A,B), subset_of(B,A).
subset_of([], _).
subset_of([X|R],L) :- memb(X,L), subset_of(R,L).
% finite set union
union([],B,B).
union(A,[],A).
union([X|Xs],B,C) :- memb(X,B), !, union(Xs,B,C).
union([X|Xs],B,[X|C]) :- union(Xs,B,C).
% finite set intersection
intersect([],_,[]).
intersect(_,[],[]).
intersect([X|Xs],B,[X|C]) :- memb(X,B), !, intersect(Xs,B,C).
intersect([_|Xs],B,C) :- intersect(Xs,B,C).
% finite set minus
setminus(A,[],A).
setminus([],_,[]).
setminus([X|Xs],B,C) :- memb(X,B), !, setminus(Xs,B,C).
setminus([X|Xs],B,[X|C]) :- setminus(Xs,B,C).
% unify open ended sets with possibly uninstantiated variable tail at the end
unify_oeset
(A
,B
) :- ( var(A
); var(B
) ), !, A
=B
.unify_oeset(A,B) :-
split_heads(A,Xs-T1), make_set(Xs,S1),
split_heads(B,Ys-T2), make_set(Ys,S2),
unify_oe_set(S1-T1, S2-T2).
make_set
(L
,S
) :- setof(X
,memb
(X
,L
),S
).
split_heads([],[]-[]).
split_heads
([X
|T
],[X
]-T
) :- var(T
), !, true.split_heads([X|Xs],[X|Hs]-T) :- split_heads(Xs,Hs-T).
% helper function for unify_oeset (almost no duplication)
unify_oe_set(Xs-T1,Ys-T2) :- T1==[], T2==[], unify_set(Xs,Ys).
unify_oe_set(Xs-T1,Ys-T2) :- T1==[], subset_of(Ys,Xs), T2=Xs.
unify_oe_set(Xs-T1,Ys-T2) :- T2==[], subset_of(Xs,Ys), T1=Ys.
unify_oe_set(Xs-T1,Ys-T2) :-
setminus(Ys,Xs,L1), append(L1,T,T1),
setminus(Xs,Ys,L2), append(L2,T,T2).
main:-
process,
process:-
/* your code goes here */
unify_oeset
([1,3,5,9|T1
],[2,3,5,6|T2
]), print
(T1
), nl, print
(T2
), nl,
:- main.
Oi0gc2V0X3Byb2xvZ19mbGFnKHZlcmJvc2Usc2lsZW50KS4KOi0gcHJvbXB0KF8sICcnKS4KOi0gdXNlX21vZHVsZShsaWJyYXJ5KHJlYWR1dGlsKSkuCgolIHNldCBtZW1iZXJzaGlwIHdpdGggbm9uLXB1cmUgYnVpbHRpbiBcPT0KJSB0byBjdXQgZG93biBkdXBsaWNhdGUgYW5zd2VycyBhcyBzZXRzCm1lbWIoWCxbWHxfXSkuCm1lbWIoWCxbWXxMXSkgOi0gWCBcPT0gWSwgbWVtYihYLEwpLgoKJSB1bmlmeSBmaW5pdGUgc2V0cyAoaS5lLiBzZXQgd2l0aCBbXSBhdCB0aGUgZW5kKQp1bmlmeV9zZXQoQSxCKSA6LSBzdWJzZXRfb2YoQSxCKSwgc3Vic2V0X29mKEIsQSkuCgpzdWJzZXRfb2YoW10sIF8pLgpzdWJzZXRfb2YoW1h8Ul0sTCkgOi0gbWVtYihYLEwpLCBzdWJzZXRfb2YoUixMKS4KCiUgZmluaXRlIHNldCB1bmlvbgp1bmlvbihbXSxCLEIpLgp1bmlvbihBLFtdLEEpLgp1bmlvbihbWHxYc10sQixDKSA6LSBtZW1iKFgsQiksICEsIHVuaW9uKFhzLEIsQykuCnVuaW9uKFtYfFhzXSxCLFtYfENdKSA6LSB1bmlvbihYcyxCLEMpLgoKJSBmaW5pdGUgc2V0IGludGVyc2VjdGlvbgppbnRlcnNlY3QoW10sXyxbXSkuCmludGVyc2VjdChfLFtdLFtdKS4KaW50ZXJzZWN0KFtYfFhzXSxCLFtYfENdKSA6LSBtZW1iKFgsQiksICEsIGludGVyc2VjdChYcyxCLEMpLgppbnRlcnNlY3QoW198WHNdLEIsQykgOi0gaW50ZXJzZWN0KFhzLEIsQykuCgolIGZpbml0ZSBzZXQgbWludXMKc2V0bWludXMoQSxbXSxBKS4Kc2V0bWludXMoW10sXyxbXSkuCnNldG1pbnVzKFtYfFhzXSxCLEMpIDotIG1lbWIoWCxCKSwgISwgc2V0bWludXMoWHMsQixDKS4Kc2V0bWludXMoW1h8WHNdLEIsW1h8Q10pIDotIHNldG1pbnVzKFhzLEIsQykuCgolIHVuaWZ5IG9wZW4gZW5kZWQgc2V0cyB3aXRoIHBvc3NpYmx5IHVuaW5zdGFudGlhdGVkIHZhcmlhYmxlIHRhaWwgYXQgdGhlIGVuZAp1bmlmeV9vZXNldChBLEIpIDotICggdmFyKEEpOyB2YXIoQikgKSwgISwgQT1CLgp1bmlmeV9vZXNldChBLEIpIDotCglzcGxpdF9oZWFkcyhBLFhzLVQxKSwgbWFrZV9zZXQoWHMsUzEpLAoJc3BsaXRfaGVhZHMoQixZcy1UMiksIG1ha2Vfc2V0KFlzLFMyKSwKCXVuaWZ5X29lX3NldChTMS1UMSwgUzItVDIpLgoKbWFrZV9zZXQoTCxTKSA6LSBzZXRvZihYLG1lbWIoWCxMKSxTKS4KCnNwbGl0X2hlYWRzKFtdLFtdLVtdKS4Kc3BsaXRfaGVhZHMoW1h8VF0sW1hdLVQpIDotIHZhcihUKSwgISwgdHJ1ZS4Kc3BsaXRfaGVhZHMoW1h8WHNdLFtYfEhzXS1UKSA6LSBzcGxpdF9oZWFkcyhYcyxIcy1UKS4KCiUgaGVscGVyIGZ1bmN0aW9uIGZvciB1bmlmeV9vZXNldCAoYWxtb3N0IG5vIGR1cGxpY2F0aW9uKQp1bmlmeV9vZV9zZXQoWHMtVDEsWXMtVDIpIDotIFQxPT1bXSwgVDI9PVtdLCB1bmlmeV9zZXQoWHMsWXMpLgp1bmlmeV9vZV9zZXQoWHMtVDEsWXMtVDIpIDotIFQxPT1bXSwgc3Vic2V0X29mKFlzLFhzKSwgVDI9WHMuCnVuaWZ5X29lX3NldChYcy1UMSxZcy1UMikgOi0gVDI9PVtdLCBzdWJzZXRfb2YoWHMsWXMpLCBUMT1Zcy4KdW5pZnlfb2Vfc2V0KFhzLVQxLFlzLVQyKSA6LSAKCXNldG1pbnVzKFlzLFhzLEwxKSwgYXBwZW5kKEwxLFQsVDEpLAoJc2V0bWludXMoWHMsWXMsTDIpLCBhcHBlbmQoTDIsVCxUMikuCgptYWluOi0KCXByb2Nlc3MsCgloYWx0LgoKcHJvY2VzczotCgkvKiB5b3VyIGNvZGUgZ29lcyBoZXJlICovCgl1bmlmeV9vZXNldChbMSwzLDUsOXxUMV0sWzIsMyw1LDZ8VDJdKSwgcHJpbnQoVDEpLCBubCwgcHJpbnQoVDIpLCBubCwKCXRydWUuCgo6LSBtYWluLg==