Formalize linked lists and show a canonical entailment using Resolution
We use the usual setup with constants, functions, and predicates for lists:
// Signature: // nil // constant for empty list // cons(x, xs) // function: attach head x to tail xs // append(xs, ys, zs) // predicate: zs is xs appended to ys // member(x, xs) // predicate: x occurs in xs // // Axioms (Horn clauses): // A1: append(nil, ys, ys). // A2: append(xs, ys, zs) -> append(cons(x, xs), ys, cons(x, zs)). // M1: member(x, cons(x, xs)). // M2: member(x, xs) -> member(x, cons(y, xs)).
Goal we’ll prove by Resolution:
append(cons(a, cons(b, nil)), cons(c, nil), cons(a, cons(b, cons(c, nil)))).