2012-04-26 2 views
4

Так что я новичок в прологе, и я предполагаю, что нужно выполнить проверку типа. Как я должен это делать? Это будет пример:Как пройти проверку типа в прологе?

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

Когда я спросил профессора, как вещи будут введены, это будет выглядеть примерно так:

instance(s, string). 

То здорово, если только это будет сделано, объединение для я потерян в конце запроса, так что если бы я, чтобы сделать слово, равно факт и назвать его, как это так,

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

, как я могу проверить, что я есть. Поэтому я просто не знаю, с чего начать. Это домашнее задание, так что просто хотите получить некоторые советы, помогите понять, как идти о моем первом проекте пролога. Заранее спасибо.

EDIT: Назначение

Напишите программу на Прологе, которая может ввести проверить вызовы метода для данной программы Java в соответствии с JLS. Фактологической базой может быть любая кодировка методов, определенных в любой нетривиальной программе Java, которую вы написали, плюс, минимально, перечисленных ниже. В запросе
режим должен проверять возможные совпадения; например, разрешить «println (string)». Вам нужно не кодировать те правила JLS, которые вам не нужны. (Один из приведенных примеров приведен выше.)

+0

Реализация проверки типа в Prolog для языка, такого как Java, определенно не является подходящим первым назначением в Prolog. Вы должны сначала изучить Пролог! – false

+0

Вот как прошел весь семестр с несколькими языками! О, хорошо. Я согласен, не лучший способ учиться. – Andy

+0

@ Энди: пожалуйста, добавьте больше информации о своей домашней работе, atm, неясно, что спрошено, и мы не можем по-настоящему помочь – m09

ответ

4

Я намеревался, что следует в качестве отправной точки. Вот моя формализация:

type(string). 

означает, что строка является доступным типом для переменного быть экземпляром

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

означает, что оператор инфикс = принимает два аргумента одного и то же типа и ничего не возвращает.

is_instance(X, Y) 

означает, что X является экземпляром типа Y Чтобы проверить вещи, я создал список «заявления», содержащихся в моем переменной Input моего test/0 предиката. Затем я рекурсивно проверяю, все ли хорошо. Вы должны реализовать третье предложение в качестве рекурсивного вызова, чтобы узнать, соответствуют ли типы в выражениях сейчас.

То, что я сделал, это то, что в моей первой основной статье check/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

Ничего себе, это много чего я не уверен, поскольку я новичок на этом языке. Но да, я очень ценю время, которое вы вложили в ответ. Однако я смущен. Выше третьего аргумента, нуль, и в коде у вас нет этого аргумента. Я что-то упускаю? Но опять же, это дает мне отправную точку для проведения большого количества исследований и выполнения домашней работы. – Andy

Смежные вопросы