【发布时间】:2017-06-14 21:15:35
【问题描述】:
我正在尝试比较两个 Fact 数据结构。
每个Fact 都由一个谓词和一个参数列表组成
private String predicate;
private ArrayList<Argument> arguments;
Argument 类由一个变量和一个符号组成
String variable;
argTypes symbol;
public enum argTypes {
STRING, EQ, GT, LT, MATCHONE, MATCHALL, VAR
}
有两个子类numericArgument和stringArgument
private boolean isNeg;
private int value; //or private String value if stringArgument
数字参数示例:length = 10, length != 10, length > 10, length < 10
字符串参数示例:length = long, length != long
arguments 的值也可能为 ?(仅匹配一个参数)、*(匹配 0 个或多个参数)、&x(变量) - 我将它们构造为通用 Argument 类型,设置他们适当的symbol 字段
那么就开始匹配吧!好的匹配示例:
cat(height = tall, colour = black, length=30) 和cat(height = tall, colour = black, length>20)
cat(black)cat(!brown)
Cat(fur = soft, colour = brown, size = 10) 匹配 Cat(fur = soft, *)
错误匹配示例:
Cat(fur = soft, colour = brown, size = 10) 和 Cat(fur = soft, colour = brown) [缺少参数完全定义了不同的谓词]
我已经实现了匹配两个Argument 对象的方法,但我正在努力实现一个比较两个Fact 对象的好方法。我已经尝试使用 Hashset 和 LinkedHashSet 代替参数数组列表。我还尝试将containsMatchAll 字段添加到Fact,而不是在参数列表中包含*。
我将非常感谢有关如何彻底检查此数据结构以使匹配不会超慢的建议。
谢谢!
【问题讨论】:
-
您如何比较:
cat(height = tall, colour = black, length>20)和cat(height = tall, colour = black, length>30)? -
@alfasin 不匹配!
-
这意味着你的“比较”不是传递的,因为它们都匹配:
cat(height = tall, colour = black, length=40)。由于比较不具有传递性(您不能应用线性顺序),因此问题与仅仅找出正确的数据结构完全不同。 -
哦,有趣! Tbh,从给出的规格来看,事情还很不清楚。假设比较确实是传递性的,请问您有什么建议?
-
但你刚才说它不是传递的......
标签: java list oop set software-design