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



所以我是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 规则进行编码。(上面给出了一个例子。

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

type(string).

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

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

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

is_instance(X, Y)

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

我所做的是,在我的第一个主要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).

我希望它能帮助您入门。

最新更新