15-317 Constructive Logic
Recitation 9: Homework 5, Prolog Lists, Cuts

Today in recitation, we went over some common mistakes on Homework 5 having to do with conventional associativities of connectives. Remember, conjunction and disjunction bind more tightly than implication, and implication is right-associative. So:

A ∧ B ⊃C means (A ∧ B) ⊃ C
A ∨ B ⊃ C means (A ∨ B) ⊃ C
A ⊃ B ⊃ C means A ⊃ (B ⊃ C)

Then we did some more Prolog programming, writing the predicates prefix and suffix that say when one list is a prefix or suffix of another. These can be used to enumerate prefixes and suffixes of a given list (?- prefix(X, [1, 2, 3]).) or to show that a non-empty list is not a prefix or suffix of the empty list (?- prefix([_|_], []).). They can also both be written using append with appropriate arguments, demonstrating some of the inherent flexibility of logic programming.

Finally, we ended with a brief discussion of green cuts and red cuts. Green cuts do not affect the meaning of a program; they merely prune needless search. A typical example of a green cut is one that commits to a clause after solving a subgoal that makes all other clauses inapplicable. We saw this in the minimum example whose clauses had disjoint preconditions -- adding a cut prunes search, but only search that would have failed. Red cuts, on the other hand, do prune search that might succeed, and in this way they change the meaning of the logic program. We saw this in the (incorrect!) minimum example which omitted the second clause's precondition: the cut changed the meaning of the program by ensuring that the second clause was never entered once the first clause's precondition succeeded.

All examples were taken from Lecture Notes 14.


(Recall that to load a file file.pl into Prolog, you give the query ['file.pl']. at the ?- prompt.)

[ Home | Schedule | Assignments | Handouts | Software ]

Frank Pfenning