我正在复习我拿到的AI课本,我已经到了我的章节的最后一个家庭作业题:
“在您选择的任何语言中实现第69页中概述的统一算法。”
在第69页,您有以下统一算法的伪代码:
function unify(E1, E2);
begin
case
both E1 and E2 are constants or the empty list:
if E1 = E2 then return {}
else return FAIL;
E1 is a variable:
if E1 occurs in E2 then return FAIL
else return {E2/E1}
E2 is a variable
if E2 occurs in E1 then FAIL
else return {E1/E2}
either E1 or E2 are empty then return FAIL
otherwise:
begin
HE1 := first element of E1;
HE2 := first element of E2;
SUBS1 := unify(HE1, HE2);
if SUBS1 := FAIL then return FAIL;
TE1 := apply(SUBS1, rest of E1);
TE2 := apply(SUBS1, rest of E2);
SUBS2 := unify(TE1, TE2);
if SUBS2 = FAIL then return FAIL;
else return composition(SUBS1, SUBS2)
end
end
end
现在,我理解了统一的一般概念,但我完全不知道如何在Java或C#这样的语言中实现它。
我甚至不确定方法签名会是什么样子。它需要哪种类型的变量?我相当确定我需要返回列表来表示谓词演算的构造,但这只是一个猜测。
例如,当它说"E1是一个变量“时,如果我把它传递给Unify方法,它怎么可能不是呢?我可以检查null,但这是否与"empty list“不同?
有没有人可以帮我或者给我指个方向,让我在C#或Java中实现统一算法?
发布于 2009-09-08 23:46:35
表示类型变体的最好方法是继承。例如,表达式序列仍然只是一个表达式。空列表将由sequence对象中的零长度容器表示。因此,对于失败,返回null是可以接受的,我用'?‘来表示。我不确定C#是否真的有一个'?',但应该明白大意了。
abstract class Expression { ... }
class Atom : Expression { ... }
class Variable : Expression { ... }
class Sequence : Expression { List <Expression> ... }
Expression? unify (Expression e1, Expression e2) { ... }
编辑:列表是协变的。参见here。我的Vala方言C#支持这一点(目前),但我不相信.net支持。
发布于 2009-09-10 15:04:55
在实现算法时,您将使用的变量可能就是您所说的元变量。它们是程序中的变量,用于描述其他程序中的变量(或常量或列表等)。因此,您需要使用一个变量来告诉您对象的类型(例如,变量、常量)和对象的值。你可以像Samuel Danielson建议的那样通过继承来做到这一点,或者通过某种Variant对象(如果你的语言提供了一个variant对象),或者通过一个可以描述任何类型的变量的手工variant类。通过描述类型和各种类型字段的枚举,根据类型,其中只有一个是有效的)。
https://stackoverflow.com/questions/1396558
复制相似问题