如何在prolog中进行类型检查?

时间:2012-04-26 06:04:47

标签: prolog typechecking

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

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

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

instance(s, string).

多数民众赞成,除非如果这样做,否则i的统一在查询结束时就会丢失,所以如果我要发表意见,等同于事实并称之为,

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

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

编辑:作业

编写一个Prolog程序,可以键入检查给定Java程序的方法调用 根据JLS。事实基础可以是任何中定义的方法的任何编码 您编写的非平凡Java程序,以及最低限度,下面列出的程序。在查询中 模式,它必须检查潜在的匹配;例如,允许“println(string)”。你需要 不编码那些您不需要的JLS规则。 (上面给出的一个例子是。)

1 个答案:

答案 0 :(得分:4)

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

type(string).

表示字符串是变量的可用类型,是

的实例
signature(=, [X, X, nil]).

表示中缀operator =接受两个相同类型的参数并且不返回任何内容。

is_instance(X, Y)

表示XY类型的实例 为了测试,我创建了我的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).

我希望这对你有所帮助。