В этом пункте нет ничего под названием "c". В листовом корпусе есть "c", но это совершенно другой случай. Вы забыли этот параметр в других случаях.
(И if t = c then true else false
эквивалентно t = c
.)
У вас также есть идентичные шаблоны во втором и третьем предложениях, что не сработает ,
Другая проблема, с которой вы сталкиваетесь, это правило "leaf is null" - лист не может быть "null".
Я подозреваю, что это то, что сбило вас с толку, так как результатом вашего первого предложения является false
даже если аргумент явно является существующим листом, а ваше второе предложение явно не листом, а выглядит как ваше второе правило.
Ваши правила должны быть такими:
Дерево содержит символ тогда и только тогда, когда
- это значение в листе, или
- это значение в узле, или
- , которое содержится в поддеревья узла.
В ML (снятие ограничения на char Tree
, поскольку оно кажется произвольным),
fun contains (Leaf t, c) = t = c
| contains (Node (left, t, right), c) = t = c
orelse contains(left, c)
orelse contains(right, c)