Это звучит как основная проблема классификации. Вы по существу спрашиваете; учитывая N признаков (цвет = синий, местоположение = вверх и т. д.), какая из М классификаций наиболее вероятна? Существует множество алгоритмов для этого (Наивный Байес, Максимальная энтропия, Машина опорных векторов), но вам придется исследовать, какой из них является наиболее точным и простым в реализации. Самой большой проблемой обычно является получение точных обучающих данных, но если вы хотите ограничить их списком вводимых вручную примеров, это должно упростить вашу реализацию.
Ваш пример предполагает, что любой выбранный вами алгоритм должен поддерживать разреженные данные. Другими словами, если вы обучили систему 300 функциям, вам не потребуется вводить все 300 функций, чтобы получить ответ. Это также уменьшит размер ваших обучающих и тестовых файлов, потому что вы не будете использовать функции, не относящиеся к определенным объектам. например,
sky | color:blue,location:up
tree | has_bark:true,has_leaves:true,is_an_organism=true
cat | has_fur:true,eats_mice:true,is_an_animal=true,is_an_organism=true
Это может быть не очень полезно, поскольку это частная собственность, но коммерческое приложение, похожее на то, что вы пытаетесь выполнить, это веб-сайт 20q.net , хотя система задает вопросы вместо пользователь. Интересно, что он обучается "онлайн" на основе пользовательского ввода.
В Википедии, конечно, много данных, но вы, вероятно, обнаружите, что извлечь данные для вашей программы будет очень сложно. Данные Cyc более нормализованы, но их API имеет огромную кривую обучения. Другой вариант - семантический словарь проекта Wordnet . Он имеет достаточно интуитивно понятные API-интерфейсы почти для каждого языка программирования, а также обширную гиперную / гипонимную модель для тысяч слов (например, кошка - это тип кошачий / млекопитающий / животное / организм / вещь).