所以我是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规则。 (上面给出的一个例子是。)
答案 0 :(得分:4)
我打算将以下内容作为起点。这是我的形式化:
type(string).
表示字符串是变量的可用类型,是
的实例signature(=, [X, X, nil]).
表示中缀operator =接受两个相同类型的参数并且不返回任何内容。
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).
我希望这对你有所帮助。