2015-05-01 4 views
1

Я пытаюсь найти решения функции, которая содержит логическое выражение, но пока не имеет успеха.Решение уравнений с логическими выражениями в Maxima

Во-первых, я определил несколько функций:

isPlant(x) := is ((x = "tree") or (x = "grass")); 
isAnimal(x) := is ((x = "cat") or (x = "dog")); 
isLiving(x) := is (isAnimal(x) or isPlant(x)); 

Далее я попытался найти все решения уравнения с этими функциями, но ни одно из решений не было получено:

solve([Living(x) = true], [x]); //this returns an empty list instead of [x = "cat", x = "dog", x = "tree", x = "grass"] 

Является ли это можно получить решения этих функций в Maxima?

+1

У Maxima нет ничего встроенного для обработки таких уравнений. Я думаю, что, возможно, [Prolog] (http://en.wikipedia.org/wiki/Prolog) более подходит. –

ответ

0

Функция решения предполагает, что домен представляет собой набор чисел. Если сначала указать домен

(%i) domain : {"tree","grass","cat","dog"}; 
(%o)      {cat, dog, grass, tree} 

, то мы можем использовать функцию subset, чтобы найти решение уравнений.

(%i) subset(domain,lambda([x], is(isPlant(x)=true))); 
(%o)       {grass, tree} 

функции вы определили предикаты, и поэтому возвращают значения true и false, что означает, что уравнения predicate(x)=true эквивалентны predicate(x). Например, IsLiving(x)=true тогда и только тогда, когда IsLiving(x). Поэтому вместо поиска элементов области, которые являются решениями уравнения predicate(x)=true, мы можем найти элементы области, которые удовлетворяют предикату, что является более кратким.

(%i) subset(domain,isLiving); 
(%o)      {cat, dog, grass, tree} 
(%i) subset(domain,isPlant); 
(%o)       {grass, tree}