gpt4 book ai didi

prolog - 如何在 prolog 中使用类型检查器?

转载 作者:行者123 更新时间:2023-12-01 01:19:03 24 4
gpt4 key购买 nike

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

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

当我问教授如何输入时,它看起来像这样:
instance(s, string).

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

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

编辑:分配

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

最佳答案

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

type(string).

意味着字符串是一个可用类型的变量作为一个实例
signature(=, [X, X, nil]).

意味着中缀运算符 = 接受两个相同类型的参数并且不返回任何内容。
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).

我希望它会帮助你开始。

关于prolog - 如何在 prolog 中使用类型检查器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10328040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com