首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Java或C#这样的语言中实现统一算法?

如何在Java或C#这样的语言中实现统一算法?
EN

Stack Overflow用户
提问于 2009-09-08 22:00:23
回答 2查看 13.1K关注 0票数 17

我正在复习我拿到的AI课本,我已经到了我的章节的最后一个家庭作业题:

“在您选择的任何语言中实现第69页中概述的统一算法。”

在第69页,您有以下统一算法的伪代码:

代码语言:javascript
复制
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中实现统一算法?

EN

回答 2

Stack Overflow用户

发布于 2009-09-08 23:46:35

表示类型变体的最好方法是继承。例如,表达式序列仍然只是一个表达式。空列表将由sequence对象中的零长度容器表示。因此,对于失败,返回null是可以接受的,我用'?‘来表示。我不确定C#是否真的有一个'?',但应该明白大意了。

代码语言:javascript
复制
abstract class Expression { ... }
class Atom : Expression { ... }
class Variable : Expression { ... }
class Sequence : Expression { List <Expression> ... }

Expression? unify (Expression e1, Expression e2) { ... }

编辑:列表是协变的。参见here。我的Vala方言C#支持这一点(目前),但我不相信.net支持。

票数 1
EN

Stack Overflow用户

发布于 2009-09-10 15:04:55

在实现算法时,您将使用的变量可能就是您所说的元变量。它们是程序中的变量,用于描述其他程序中的变量(或常量或列表等)。因此,您需要使用一个变量来告诉您对象的类型(例如,变量、常量)和对象的值。你可以像Samuel Danielson建议的那样通过继承来做到这一点,或者通过某种Variant对象(如果你的语言提供了一个variant对象),或者通过一个可以描述任何类型的变量的手工variant类。通过描述类型和各种类型字段的枚举,根据类型,其中只有一个是有效的)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1396558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档