2012-04-26 1 views
4

그래서 저는 프롤로그를 처음 접했고 유형 검사기를 구현한다고 가정합니다. 어떻게해야할까요? 내가 일을 입력 얼마나 교수를 물었을 때프롤로그에서 유형 검사기를 사용하는 방법은 무엇입니까?

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

, 그것은 같은 것을 보일 것이다 :이 작업을 수행하는 경우를 제외하고

instance(s, string). 

이 큰 그게 전부를, 통일에 대한이 예 것 내가 쿼리의 마지막에서 잃어버린, 그래서 내가 말을한다면,

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

어떻게 내가이 무엇인지 확인할 수 있습니다, 사실을 같고과 같이 호출된다. 그래서 나는 어디서부터 시작해야할지 아는 데 어려움을 겪고 있습니다. 그것의 숙제는, 그래서 다만 약간 통보를 원한다, 나의 첫번째 프롤로그 프로젝트에 관하여가는 방법 이해의 종류에 도움. 미리 감사드립니다.

편집 : 할당

는 방법은 JLS에 따라 지정된 Java 프로그램 요구를 확인 입력 할 수있는 프롤로그 프로그램을 작성합니다. 팩트베이스는 작성한 평범하지 않은 Java 프로그램
에 정의 된 메소드의 인코딩 일 수도 있고, 최소한 다음에 나열된 메소드 일 수도 있습니다. 쿼리
모드에서 일치하는 항목을 확인해야합니다. 예를 들어 "println (string)"을 허용합니다. 은 필요없는 JLS 규칙을 인코딩하지 않아야합니다. (주어진 예 중 하나가 위에 있습니다.)

+0

Java와 같은 언어에 대한 Prolog에서 유형 검사기를 구현하는 것은 Prolog에서 적절한 첫 번째 할당이 아닙니다. 먼저 프롤로그를 배워야합니다! – false

+0

이것은 몇 가지 언어로 전체 학기를 마쳤습니다! 오. 나는 동의한다, 배우는 가장 좋은 방법이 아니다. – Andy

+0

@Andy : 숙제에 대한 더 많은 정보를 추가하십시오. 무엇이 요구되는지 명확히 알지 못합니다. – m09

답변

4

나는 출발점으로 다음을 의도했다.

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). 

시작하는 데 도움이되기를 바랍니다.

+0

와우, 나는이 언어로 새로운 것이기 때문에 나는 너무 확신하지 못한다. 그러나 네, 당신이 대답 할 시간을 크게 주셔서 감사합니다. 나는 서명에 대해 혼란스러워합니다. 위에는 세 번째 인수 인 nil이 있으며 코드에는이 인수가 없습니다. 내가 놓친 게 있니? 그러나 다시 한 번, 이것은 많은 연구를하고 숙제를 끝내는 출발점을 제공합니다. – Andy