【问题标题】:How to make a simple predicate engine如何制作一个简单的谓词引擎
【发布时间】:2012-12-20 11:30:32
【问题描述】:

我有一个任务,用户可以: 1.形成任意点任意坐标; 2.根据标准删除点。

我意识到: 1. 简单标准的情况(>、= 等)。 2. 复合标准的情况,它由两个标准组成,它们之间有 OR (x>5 或 y

我用 C 编程,所以据我所知并尽我所能,不可能使用自修改代码。

我决定将自己限制在两个条件之间,即 OR 或 AND。 我可以看到:>、=、

但除了为每个独特案例提供特殊条件之外,我无法想象任何事情。 当然,我可以根据每个查询选择所有内容。然后像我们在离散数学中所做的那样,对 AND 使用交集或对 OR 使用加法。但我想以最快的方式做到这一点:计算机应该只选择必要的。

所以对于我提供的每种情况 如果 (x > 值 & y

等等。

但这似乎太疯狂了。你能推荐什么给我吗?

【问题讨论】:

  • 修改你的标签——理论上对你的帖子来说根本不是一个好的标签。也请尽量简化问题。我现在不太明白。

标签: c predicate scripting-language


【解决方案1】:

这是关于解释自定义脚本代码。

它在实践中的工作原理很容易通过使用对象来解释,但如果没有它们则更加困难。如果没有对象,您将需要一个能够存储谓词的自定义结构,我将给您一个简单的示例,以稍微清楚一点:

union Expression {
  char type;
  int number;
};

int expressionValue(const Point &curPt, const Expression &exp) {
  if (type == TYPE_NUMBER) return exp.number;
  else if (type == TYPE_X) return curPt.x;
  else if (type == TYPE_Y) return curPT.y;
};

这样你就有了一个联合,它可以为你的表达式存储任意类型的值,可能是原始数字或当前点的坐标。

struct Comparison {
  Expression exp1;
  Expression exp2;
  char type;
};

bool evaluateComparison(const Point &curPt, const Comparison &comp) {
  int v1 = expressionValue(pt, exp1);
  int v2 = expressionValue(pt, exp2);

  if (type == '=') return v1 == v2;
  else if (type == '<') return v1 < v2;
  // so on
}

现在您有了一个能够存储单个比较的数据类型,您需要一种存储谓词的方法:

struct Predicate {
  char type;
  Comparison comp1;
  Comparison comp2;
};

bool evaluatePredicate(const  Point &curPt, const Predicate &pred) {
  if (pred.type == TYPE_OR) return evaluateComparison(curPt, comp1) || evaluateComparison(curPt, comp2);
  // oothers
};

当然,您可以计划所需的任何类型的表达式或谓词(可能是 n 元 AND 或 OR)。

您最后需要的是一个简单的词法分析器和解析器,将您的输入转换为谓词,然后您对您的观点进行评估,然后就完成了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2012-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    相关资源
    最近更新 更多