节目简介
我正在开发一个存储如下数据的程序:
- 事实:属性列表(或仅一个)和真/假值(称为“真”值)的组合。例如:
父母('约翰','小约翰'),真
其中John
作为父母的属性John jr
为真。我用于存储事实的代码:
public class Fact implements Serializable{
private boolean truth;
private ArrayList<Property> properties;
public Fact(){
truth = false;
properties = new ArrayList<Property>();
}
//more constructors, getters, setters and other functions which are not important for this question...
- 规则:用于从事实中获取信息。它们的工作原理是让一个事实(我称之为派生事实)暗示另一个事实(我称之为隐含事实):
父母('x','y')=> 孩子('y','x')
这意味着通过将规则应用于上述事实,我们可以确定它John jr
是 的孩子John
。
规则的属性:
消极性:
规则可以是“肯定的”(如果导数为真,则蕴含为真):
父母('x','y')=> 孩子('y','x')
或“否定”(如果导数为真,则蕴涵为假):
父母('x','y')=>不是孩子('y','x')
可逆性:
它们也可以是“可逆的”(如果导数是假的,则蕴含的是真/假):
不是父母('x','y')=> 孩子('y','x')
或(如果也是负数):
不是父母('x','y')=> 不是孩子('y','x')
或“不可逆”(如果导数为假,则隐含项未知):
不是父母('x','y')=>(未知)
我用来存储规则的代码如下所示:
public class Rule implements Serializable{
private Property derivative;
private Property impliant;
private boolean negative;
private boolean reversive;
public Rule(Property derivative, Property impliant) throws InvalidPropertyException{
if(!this.validRuleProperty(derivative) || !this.validRuleProperty(impliant))
throw new InvalidPropertyException("One or more properties are invalid");
this.derivative = derivative;
this.impliant = impliant;
negative = false;
reversive = false;
}
//again more constructors, getters, setters and other functions which are not important for this question...
信息集
事实和规则存储在InformationSets
其中,将这些事实和规则捆绑在一起,以便用户可以“质疑”里面的信息。这可以通过两种不同的方式完成:
1.事实检查:检查事实是否属实。给定一个事实,这将根据该事实的真值返回真或假。例如,用户可以问:
父母('约翰','小约翰')?
并且程序将在以下情况下返回true
:
父母('小约翰','小约翰')?
将返回false
。
问号表示用户想要提出“事实核查”问题。
1.隐含检查:对于给定的事实(称为问题事实),这将返回可以应用于问题事实的每个规则的事实列表。例如:
父母('约翰','小约翰')=>
这将返回:
孩子('小约翰','约翰')
箭头表示用户想要提出“隐含检查”问题。
问题编码如下:
public class Question {
Fact questionFact;
String operator;
public Question(Fact questionFact, String operator) throws InvalidOperatorException{
if(!validOperator(operator))
throw new InvalidOperatorException("The operator is invalid");
this.questionFact = questionFact;
this.operator = operator;
}
在Operator
我存储的字段内?
或=>
根据用户想问的问题。
问题
我目前正处于需要编写向给定信息集提问的方法的地步。所以我需要一个方法,给出一个问题,一个信息集返回一个true
,false
或者一个事实列表。据我所知,这在java中是不可能的。
我试图为每个有点工作的问题制作一个单独的方法,但这也会导致一个问题,因为我希望能够编写如下内容:
informationSet.ask(question);
并让该ask()
方法处理这两种类型的问题,因此我不必检查用户在用户界面代码中提出的问题类型,而是让程序的后端解决它。
有什么好方法可以做到这一点?