Неограниченная декларация имени переменной в ртути - PullRequest
2 голосов
/ 16 декабря 2011

Я хотел бы объявить тип данных в Меркурии, который может иметь переменное количество значений и имен.Например:

type goal ---> pick; give; come.

имеет три переменные / значения.

Я хочу что-то вроде:

type myplayer ---> de value declaration here.

, чтобы число переменных не было ограничено или фиксировано.

Так что я могу использовать myplayer для объявления значений / переменных, таких как v1, v2, v3 and v4. Во второй раз я могу использовать его для delcare что-то вроде: a, b, c, d, e, z, aa, ab and az.

Количество значений не ограничено и имена также не фиксированы.

Я новичок в Меркурии, поэтому мне нужна помощь.

спасибо

Ответы [ 3 ]

2 голосов
/ 17 декабря 2011

Как уже говорили другие, это просто невозможно в Меркурии - что является преднамеренным.

Хотя вы можете захотеть, если вам нужен тип, выражающий: v1 v2 v3 ... и т. Д.:

:- type my_type
    ----> v(int).

:- func name(my_type) = string.

name(v(Num)) = formst("v%d", [i(Num)]).

Тип выражает v всех целых чисел, а имя функции можно использовать для «симпатичного вывода» значений этого типа.

1 голос
/ 02 января 2013

Насколько я понимаю этот вопрос. Вы хотите какое-то прологоподобное поведение. Т.е. без типизированных предикатов. В статически типизированной системе вы всегда можете добиться такого поведения, управляя этим самостоятельно. Много лет назад я видел такой пример в Turbo Prolog (они реализовали пролог ISO в терминах Turbo / Visual Prolog).

Рассмотрим что-то вроде (я не уверен, что это правильно):

:- type any_type ---> atom_value(string)
                 ;    number_value(int)
                 ;    struct_value(any_type, list(any_type)).

guess(atom_value("v1")).
guess(atom_value("a")).
guess(atom_value("aa")).
guess(number_value(42)).
guess(struct_value(atom_value("pair"), [number_value(3), number_value(4)])).
1 голос
/ 17 декабря 2011

То, что вы прямо просите, просто не может быть сделано.С учетом

:- type question
        --->    truth(string, bool)
        ;       blank(string, string)
        ;       multiple(string, string, list(string)).

дополнительные виды вопросов могут быть добавлены только путем расширения этого типа там, где он определен, и перекомпиляции модуля - и внесения множества других изменений, как ранее детерминированный код, такой как

answer(truth(_, yes)) = "true".
answer(truth(_, no)) = "false".
answer(blank(_, A)) = A.
answer(multiple(_, A, _)) = A.

потерпит неудачу, если вы зададите новый тип вопроса.Во время компиляции вам сообщают, что вы не смогли обновить свою программу, чтобы отразить добавление вопроса типа «выбери все права» - хорошая причина того, что у тебя вообще есть тип вопроса,вместо, скажем, списков строк [["Are foxes pretty?", "true"], ["Green foxes are ____", "adorable!", "fake", "evidence of animal cruelty"]] для вашего банка вопросов.

Невозможно выполнить то, о чем вы просите.Однако то, что вы на самом деле хотите сделать - конец, для которого вы думали, что «переменное число типов» было бы полезным средством, - безусловно, может быть достигнуто иным способом.Я не могу сказать, что это такое, так как я не могу сказать, почему вы хотели сделать это из вашего вопроса.Возможно, вам будет полезно прочитать более 1010 * различающихся союзов или классов типов в справочнике по языку.

...