LogDB 数据库中填充了事实(facts)。事实由一个名称以及一个包含名称列表的括号主体组成。这类似于函数调用:
fact1(arg1, arg2, arg3, 4, 4) thing(p1, arg2, p3)
fact1 是事实的名称,括号中的名称列表是该事实的参数。thing 是另一个事实。
列表中的名称由逗号和可选的空格分隔。列表中至少会有一个名称。名称由字母数字字符(a–z, A–Z, 0–9)加上 _ 组成。但是,事实的名称和主体中的名称不能以 _ 开头。名称、括号和逗号前后可以有空格。不过,一个事实或查询不能跨行。
具有不同参数数量的事实被视为不同的事实。同一个事实可以在数据库中出现多次。
查询(Queries)与事实类似,但参数列表中可以包含变量。变量是以 _ 开头的名称。
查询会在数据库中搜索与查询名称相同、参数数量相同,且事实主体中的名称与查询主体中对应位置的名称相匹配的事实。
仅由 _ 组成的变量是特殊的,它可以匹配任何名称。除 _ 以外的变量也可以匹配任何名称,但如果该变量在同一个查询中出现多次,则事实中对应位置的名称必须相同。例如,查询:
fact1(arg1, _X, _X, check, check)
将匹配 fact1(arg1, arg2, arg3, 4, 4)。
变量仅在它们出现的查询中定义。如果它们出现在不同的查询中,则它们之间没有必然联系。
输入由两部分组成:事实和查询。测试数据没有语法错误。
事实部分由一系列最多 200 个字符的行组成。该部分以一个空行结束。每一行包含若干个事实,事实之间可能(也可能不)由空格分隔。事实部分总共不超过 200 行。
查询部分由一系列最多 200 个字符的行组成。该部分以文件结束符(EOF)结束。每一行是一个查询。查询部分总共不超过 200 行。
对于每个查询,请以整数形式打印该查询返回的事实数量。数值之间应以换行符和/或空格分隔。
样例
输入 1
test(arg1, arg2,arg3) test(1,2,3,not4)5(five) five_seven(john_smith,10_17_57) foo(1,2,3,4) foo(5,6,7,8) foo(1,2,7,8)arc(80) foo(abc,xyz) bar(1,2) bar (7,8) zoom(8,7) arc(80) nofoo(alpha,d1,d2,d1,d4,d1) foo(bar,spam) foo(more,less) test(_,_,_,_) arc(80) foo(bar,_) foo(_,spam) foo(_,less) nofoo(_, _p1, _, _p1, _, _p1) foo(bar,less) foo(_,_,_,_) foo(_,_,30,40) foo(_,_,30,40) foo(_,_,30,40) foo(_x,_,30,40) foo(_,_,30,40)
输出 1
1 2 1 1 1 1 0 3 3 3 3 3 3