In general (but not always), causality of a linear, time invariant (LTI) system cannot be determined by inspection of the difference equatin that defines the system's input/output relationship.
Causality can always be determined by the system's unit pulse response. The system is causal if the unit pulse response is zero for k < 0 and noncausal otherwise.
Define the variables and signals
Define the discrete-time unit step, assuming the default sympref for heaviside (i.e., heaviside(0) = 1/2
u(k) = heaviside(k) + kroneckerDelta(k)/2;
Consider the system at hand
deqn = y(k+2) + 2*y(k+1) + 1/2*y(k) == x(k+1) + x(k)
deqn =

If x[k] is the unit pulse, then we have
x(k) = kroneckerDelta(k);
deqn = subs(deqn)
deqn =

Taking the bilateral z-transform of both sides, and solving for Y(z) (and renaming it to H(z) as is common of the unit pulse response) we have
H(z) = (z+1)/(z^2 + 2*z + 1/2)
H(z) =

Compute the poles of H(z) to use later
[~,index] = sort(abs(double(poles)));
poles = double(poles(index)).';
The partial fraction expansion of H(z) is
H(z) = partfrac(H(z),'FactorMode','full')
H(z) =

Plot the poles in the z-plane. The colored regions are three possible regions of convergence (ROCs) for H(z) where the blue region extends to infinity and the boundaries between red and green and between green and blue are not included, i.e., the ROCs are open (the origin is included in the red).
pr = radiusregion(abs(double([0,poles;poles,3])));
pr(1).FaceColor = 'r';pr(2).FaceColor = 'g'; pr(3).FaceColor = 'b';
pr(2).EdgeColor = 'm';pr(2).LineWidth = 1.5;pr(2).LineStyle = '--';
polarplot(angle(poles),abs(poles),'kx','MarkerSize',10)
The unit pulse response, h[k], can be one of three possbilities depending on what we assume for the ROC.
Ha(z) = c{1}, Hb(z) = c{2}
Ha(z) =

Hb(z) =

h1(k) = iztrans(Ha(z),z,k)*u(k) + iztrans(Hb(z),z,k)*u(k);
h2(k) = subs(iztrans(Ha(1/z),z,k)*u(k) + iztrans(Hb(1/z),z,k)*u(k),k,-k);
h3(k) = iztrans(Ha(z),z,k)*u(k) + subs(iztrans(Hb(1/z),z,k)*u(k),k,-k);
If we substitute h[k] into the LHS of the difference equation, we should obtain the RHS
subs(lhs(deqn),[y(k+2),y(k+1),y(k)],[h1(k+2),h1(k+1),h1(k)]);
subs(lhs(deqn),[y(k+2),y(k+1),y(k)],[h2(k+2),h2(k+1),h2(k)]);
subs(lhs(deqn),[y(k+2),y(k+1),y(k)],[h3(k+2),h3(k+1),h3(k)])];
deqnlhs doesn't simplify well symbolically (at least for me), but we can show via evaluation that all three solutions satisfy the difference equation
simplify(subs(deqnlhs,k,kval)) - subs(rhs(deqn),k,kval)]
ans =

Plot all three unit pulse responses
stem(subplot(311),kval,h1(kval));ylabel('h1[k]');axis padded
stem(subplot(312),kval,h2(kval));ylabel('h2[k]');axis padded
stem(subplot(313),kval,h3(kval));ylabel('h3[k]');axis padded
Only h1[k] = 0 for k < 0, so the LTI system described by the original difference equation is causal only if we take h1[k], which corresponds to the blue ROC, as its unit pulse response.
If we assume the system is causal, then we solve the system iteratively forward in time given two auxilliary conditions. For example, we can specify y[0] and y]1], then iterate forward starting from y[2] for some input x[k]
For example, suppose x[k] = 0.8^k * u[k]
with auxilliary conditions y[0] = 5 and y[1] = 10
yval(0 + 1) = 5; yval(1 + 1) = 10;
The iteration loop to solve for y[2] to y[10] is (w/o preallocating y for this simple problem)
yval(kk+2 + 1) = -2*yval(kk+1 + 1) - 1/2*yval(kk + 1) + xval(kk+1 + 1) + xval(kk + 1);
Plot the output and show that it satisfies the auxilliary conditions and the difference equation
stem(kval,yval),xlabel('k');ylabel('y[k]');
yval((0:1) + 1)
ans =
5 10
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
yval((0:8)+2 + 1) + 2*yval((0:8)+1 + 1) + 1/2*yval((0:8) + 1) - xval((0:8)+1 + 1) - xval((0:8) + 1)
ans =
1.0e-13 *
0.0067 -0.0244 -0.0455 -0.0577 -0.0178 -0.6400 0.9653 0.0333 0.3675
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
We can also solve this causal system symbolically via the z-transform
deqn = lhs(deqn) == x(k+1) + x(k);
zeqn = subs(zeqn,[y(0),y(1),ztrans(y(k))],[5,10,Y(z)]);
Y(z) = rhs(isolate(zeqn,Y(z)))
Y(z) =

y(k) = iztrans(Y(z),z,k)
y(k) =

Verify that the symbolic solution matches the numerical solution found through iteration
double(y(0:10))-yval
ans =
1.0e-12 *
0 0 0 0.0071 0 0.0142 -0.0284 0.1137 -0.2274 0.4547 -0.9095
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>