多对多 - Prolog / Excel

时间:2015-09-23 14:17:05

标签: excel prolog excel-formula

在Prolog中,我有一个像这样的数据库:

invoice(number,item,product,value).

invoice('2015/01',1,coffee,100).
invoice('2015/02',1,water,50).
invoice('2015/02',2,coffee,100).
invoice('2015/03',1,milk,80).
invoice('2015/03',2,cake,150).

我需要问Prolog这个问题:有多少发票没有咖啡或水? 在这种情况下,答案是1(发票号码2015/03)

我也想在Excel DB中回答这个问题。我使用" = countifs"功能,但它只给我一些不是咖啡或水的项目...这样的事情:

=COUNTIFS(D4:D11;"<>"&"coffee";D4:D11;"<>"&"water")

在这个例子中它给了我2,

但我想只有发票数量。

1 个答案:

答案 0 :(得分:-2)

以下是成绩单:

$ gprolog
GNU Prolog 1.4.4 (64 bits)
....
Copyright (C) 1999-2013 Daniel Diaz
| ?- ['invoice'].
['invoice'].
yes

| ?-  setof(N, I^P^V^(invoice(N,I,P,V), \+(P = water), \+(P = coffee)), Ns),
      length(Ns, Number).

Ns = ['2015/03']
Number = 1

yes
| ?- 

为了说明解决方案是标准的,这里是一个使用swi-prolog的略微缩写的成绩单:

$ swipl
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 6.6.4)
Copyright (c) 1990-2013 University of Amsterdam, VU Amsterdam
?- [invoice].
true.

?- setof(N, I^P^V^(invoice(N,I,P,V), \+(P = water), \+(P = coffee)), Ns), length(Ns, Number).
Ns = ['2015/03'],
Number = 1.

?-