MGUs(最一般合一子)的概念似乎在这里很有用。解决方法如下所示。
让我们拥有一个名为mgu的初始空集和另一个空集E。
mgu = {}
G = match(Loves(Dog(Fred),Fred),Loves(x,y))
E = {Loves(Dog(Fred),Fred),Loves(x,y)}
mgu = {Fred|y} // Replace Fred by y, variables to be replaced first.
G = match(Loves(Dog(y),y),Loves(x,y))
E = {Loves(Dog(y),y),Loves(x,y)}
mgu = {Fred|y,Dog(y)|x} // Replace Dog(y) by x
G = match(Loves(x,y),Loves(x,y))
E = {Loves(x,y)} // E becomes a singleton set here, we stop here.
// No more substitutions are possible at this stage.
match()函数在不再进行替换时,如果E变成单例集,则返回True,否则返回False。而mgu可以作为所需的替换集合返回。
G = True
mgu = {Fred|y,Dog(y)|x}
另一个例子可以如下所示。
mgu = {}
G = match(Loves(Dog(Fred),Fred),Loves(x,x))
E = {Loves(Dog(Fred),Fred),Loves(x,x)}
mgu = {Fred|x} // Replace Fred by x.
G = match(Loves(Dog(x),x),Loves(x,x))
E = {Loves(Dog(x),x),Loves(x,x)}
mgu = {Fred|x,Dog(x)|y} // Replace Dog(x) by y
G = match(Loves(y,x),Loves(x,x))
E = {Loves(y,x),Loves(x,x)} // E does not becomes a singleton set here.
// But no more substitutions are
// possible at this stage.
因此,
G = False