4

所以我是 prolog 的新手,我想实现一个类型检查器。我应该怎么做?这将是一个例子:

String s; int i; i = s.length(); // OK (example given in the homework)

当我问教授如何输入内容时,它看起来像这样:

instance(s, string).

太好了,除非这样做了,否则 i 的统一在查询结束时会丢失,所以如果我要说,等于事实并这样称呼它,

equals(i, s, '.', 'length').

我怎样才能检查我是什么。所以我只是很难知道从哪里开始。这是一个家庭作业,所以只需要一些建议,帮助了解如何进行我的第一个 prolog 项目。提前致谢。

编辑:作业

编写一个 Prolog 程序,该程序可以根据 JLS 对给定 Java 程序的方法调用进行类型检查。事实库可以是
您编写的任何重要的 Java 程序中定义的方法的任何编码,至少还可以是下面列出的那些。在查询
模式下,它必须检查潜在的匹配;例如允许“println(string)”。您不需要对那些不需要的 JLS 规则进行编码。(上面给出的示例之一。)

4

1 回答 1

4

我打算将以下内容作为起点。这是我的形式化:

type(string).

意味着 string 是变量的可用类型

signature(=, [X, X, nil]).

意味着中缀运算符 = 接受两个相同类型的参数并且不返回任何内容。

is_instance(X, Y)

意味着这X是一个类型的实例Y 为了测试事情,我创建了一个包含在我的谓词变量中的“语句”Input列表test/0。然后我递归地测试事情是否正常。您必须将第三个子句实现为递归调用,以查明现在表达式中的类型是否正常。

我所做的 atm 是在我的第一个主要check/2条款中,我处理instance/2术语,而在接下来的一个中,我处理所有其余部分。

:- dynamic is_instance/2.

type(string).
type(int).

signature(=, [X, X, nil]).

test :-
    retractall(is_instance(_, _)),
    Input = [instance(s, string), instance(i, int), =(i, length(s))],
    check(Input, ReturnTypes),

check([], []).
check([instance(Variable, Type)|Terms], [nil|ReturnTypes]) :-
    !,
    ( is_instance(Variable, _) -> syntax_error('Variable already declared')
    ; \+ type(Type) -> syntax_error('Using a non-existing type'),
    ; Term =.. [is_instance, Variable, Type],
      assertz(Term)),
    check(Terms, ReturnTypes).

check([Term|Terms], [Type|ReturnTypes]) :-
    Term =.. [Name|Arguments],
    % Here we have to call ourselves with our list of arguments
    % and then check that everything is fine and then we'll unify Type
    % with the return value of Name.
    check(Terms, ReturnTypes).

我希望它能帮助你开始。

于 2012-04-26T20:09:42.270 回答