所以我是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).
我希望它能帮助您入门。