有没有只用ANDs复制OR运算符的方法?

时间:2017-08-18 16:27:19

标签: c# logic set-theory

所以我试图找到一种方法来允许在我的应用程序的前端进行OR操作,然后在后端服务器上转换条件,然后将与Intrinio(Financial Data API)对话。我尝试使用的端点(为了节省api调用信用)只允许AND运算符,但我希望有一些解决方法。

以下是我尝试使用的端点:http://docs.intrinio.com/#securities-search-screener

以下是我要发送到服务器进行翻译的示例条件:

open_price > 10 && (current_volume > 1000000 || current_volume > average_volume)

P.S open_price,current_volume和average_volume都是Intrinio生态系统中使用的标签

我可能还应该提到他们没有不

我恳请你们在评论之前查看链接......

3 个答案:

答案 0 :(得分:1)

一般情况下,你不能。

在此API中,您只能否定原子条件,将~gt~更改为~lte~等,e。 G。将open_price~gt~10更改为open_price~lte~10

但是你不能否定这个API中的非原子条件,特别是你不能使用De Morgan的定律。

n 变量只有 3 n (+1)布尔函数,可以使用连词和原子否定来表达。 n 变量的布尔函数总数为 2 2ⁿ 。顺便说一下,所有这些都可以使用连接和非原子否定来表达。因此,存在使用连词和原子否定无法表达的布尔函数。

您应该在API客户端上发出两个或更多请求,然后联合结果。 有几种方法可以执行请求数量不同,检索的记录总数(某些记录可能被检索多次),以及所需的API调用信用(等于条件数)。

让我们假设原始数据如下所示(让我们跳过open_price属性)。

{
  {
   "identifier": "A-OK",
   "current_volume": 1000002, "average_volume": 1000001
  },
  {
   "identifier": "B-OK",
   "current_volume": 1000001, "average_volume":  999999
  },
  {
   "identifier": "D-OK",
   "current_volume":  999999, "average_volume":  999998
  },
  {
   "identifier": "E-OK",
   "current_volume": 1000001, "average_volume": 1000002
  },
  {
   "identifier": "G-NO",
   "current_volume":  999999, "average_volume": 1000001
  },
  {
   "identifier": "H-NO",
   "current_volume":  999998, "average_volume":  999999
  }
}

您需要检索标识为A-OKB-OKD-OKE-OK的记录。

方法1 (两个请求,结果集不相交)

current_volume~gt~1000000
current_volume~gt~average_volume

如您所见,我们只是在客户端执行析取,而不是在服务器上执行...

方法2 (三个请求,结果集不相交)

current_volume~gt~1000000,current_volume~gt~average_volume
current_volume~gt~1000000,current_volume~lte~average_volume
current_volume~lte~1000000,current_volume~gt~average_volume

在这种方法中,我们依赖于这一事实:A||B等于(A && B) ^^ (A && !B) ^^ (!A && B)

方法3 (两个请求,结果集不相交)

current_volume~gt~1000000
current_volume~lte~1000000,current_volume~gt~average_volume

在这种方法中,我们依赖于这一事实:A||B等于A ^^ (!A && B)

方法4 (两个请求,结果集不相交)

在您的特定情况下,存在一种依赖于实数上的顺序关系的传递性的方法。

average_volume~gt~1000000,current_volume~gt~1000000
average_volume~lte~1000000,current_volume~gt~average_volume

但是,这种方法在API调用信用方面没有太大的利润。

<强>比较

+----------+----------+-----------+--------------+----------+
| Approach | Number of| Records   | Resultsets   | Total    |
|          | requests | retrieved | disjointness | credits  |
+----------+----------+-----------+--------------+----------+
|  # 1     |    2     |   6 (3+3) |    no        |    2     |
|  # 2     |    3     |   4       |    yes       |    6     |
|  # 3     |    2     |   4       |    yes       |    3     |
|  # 4     |    2     |   4       |    yes       |    4     |
+----------+----------+-----------+--------------+----------+

答案 1 :(得分:0)

根据DeMorgan's lawsa && b相当于!(!a || !b)

您可以将and视为

  

a b都是true

或等效

  

a b都不是false

答案 2 :(得分:0)

首先检查average_volume和1000000中哪一个是更大的值,然后根据结果选择要检查的条件:

ol.work > li