Компьютерный форум

Компьютерный форум (http://www.hardforum.ru/)
-   Prolog (http://www.hardforum.ru/f141/)
-   -   Ввод правил от пользователя (http://www.hardforum.ru/t69696/)

rogue_uss 29.09.2006 04:24

По курсу рекурсивно-логическое программирование была дана задача:
Описать разбиение множества на классы эквивалентности (при условии что задано отношение эквивалентности двух элементов множества p(x,y)). Множества должны быть представлены бинарными деревьями.
По сути я сталкнулся с одной проблемой - как ввести от пользователя новое правило и как его использовать. Это вообще реально. Я использую SWI-Prolog версии 5 или около того...

Помогите. Заранее благодарен...

Kurt_Rassel 29.09.2006 11:37

Я бы тоже присоединился к вопросу, только про VIP 7, можно ли в процессе исполнения программы добавлять правила произвольного вида, и чтобы система сразу начинала бы их использовать? Если напрямую нельзя, может есть какая-нибудь стандартная метода как бы это сделать?

ZhekaS 29.09.2006 13:02

Цитата:

Я бы тоже присоединился к вопросу, только про VIP 7, можно ли в процессе исполнения программы добавлять правила произвольного вида, и чтобы система сразу начинала бы их использовать? Если напрямую нельзя, может есть какая-нибудь стандартная метода как бы это сделать?
Не знаю как в VIP, но в классическом прологе это делается с помощью предикатов asserta и assertz.

VictorY 29.09.2006 14:15

Цитата:

Я бы тоже присоединился к вопросу, только про VIP 7, можно ли в процессе исполнения программы добавлять правила произвольного вида, и чтобы система сразу начинала бы их использовать? Если напрямую нельзя, может есть какая-нибудь стандартная метода как бы это сделать?
Цитата:

Не знаю как в VIP, но в классическом прологе это делается с помощью предикатов asserta и assertz.
Ни в одной из версий Vip такой возможности нет.
В Vip для обеспечения такой возможности рекомендуется либо использовать поставляемый интерпретатор классического Пролога PIE, либо правила помещать в текстовый файл, включенный в проект DLL и затем этот проект компилировать на лету и вызывать эту DLL (компилятор в VIP поставляется в виде отдельного приложения).

ZhekaS 29.09.2006 14:26

Цитата:

Ни в одной из версий Vip такой возможности нет.
В Vip для обеспечения такой возможности рекомендуется либо использовать поставляемый интерпретатор классического Пролога PIE, либо правила помещать в текстовый файл, включенный в проект DLL и затем этот проект компилировать на лету и вызывать эту DLL (компилятор в VIP поставляется в виде отдельного приложения).
Насколько мне известно, SWI он ISO-compliant, так что там, пожалуй, прокатит.

TypucT 29.09.2006 14:54

Вот на SWI:
Код:

go:-
        read(NewRule),      % пользователь вводит
        assert(NewRule),    % если понадобится в дальнейшем - добавляем в базу правил
        NewRule.                % используем

Код:

?- go.
|: my_rule(a,b).
Yes
?- my_rule(X,Y).
X = a
Y = b;
No


Alison 29.09.2006 16:37

Что касается самой задачи:
Цитата:

Описать разбиение множества на классы эквивалентности (при условии что задано отношение эквивалентности двух элементов множества p(x,y)).
Если есть список всех элементов множества (можно его найти) и есть отношение эквивалентности, описанное с помощью предиката p (p(X,Y) - это истина тогда и только тогда, когда X~Y), то найти разбиение множества на классы эквивалентности можно, например, так:
Код:

классы([X|ВсеЭлем], [Класс|ФакторМнож]):-
    findall(Y, p(X,Y), Класс),
    разность(ВсеЭлем, Класс, ОстЭлем),
    классы(ОстЭлем, ФакторМнож).
классы([], []).


Винитарх 30.09.2006 01:33

Браво Alison!
Только надо добавить, что возможные отношения эквивалентности должны быть известны на этапе проектирования.

Kurt_Rassel 02.10.2006 11:52

Цитата:

Код
go:-
read(NewRule), % пользователь вводит
assert(NewRule), % если понадобится в дальнейшем - добавляем в базу правил
NewRule. % используем


Код
?- go.
|: my_rule(a,b).
Yes
?- my_rule(X,Y).
X = a
Y = b;
No
Немножко неудачный пример. Здесь у тебя правило в виде факта. А факты в VIP можно добавлять на лету, правда не так изящно. Если я не ошибаюсь надо декларировать функтор и арность заранее, но эту беду можно побороть. Я имел ввиду правила вида P :- S,X,Y.

Kurt_Rassel 02.10.2006 12:07

Цитата:

Ни в одной из версий Vip такой возможности нет.
В Vip для обеспечения такой возможности рекомендуется либо использовать поставляемый интерпретатор классического Пролога PIE, либо правила помещать в текстовый файл, включенный в проект DLL и затем этот проект компилировать на лету и вызывать эту DLL (компилятор в VIP поставляется в виде отдельного приложения).
Спасибо, интересная мысль, надо попробовать, правда компилер надо будет всегда держать под рукой (а он тяжеловат, с дллками). А в будещих версиях сей трабл не пофиксят? не в курсе?

Kurt_Rassel 02.10.2006 12:34

Цитата:

Ни в одной из версий Vip такой возможности нет.
В Vip для обеспечения такой возможности рекомендуется либо использовать поставляемый интерпретатор классического Пролога PIE, либо правила помещать в текстовый файл, включенный в проект DLL и затем этот проект компилировать на лету и вызывать эту DLL (компилятор в VIP поставляется в виде отдельного приложения).
Сорри еще один вопросик, насчет "компилятора в VIP поставляемого в виде отдельного приложения".
У меня установлен VIP7PE и в C:\Program Files\Visual Prolog 7.0\bin есть vip7compiler.exe и vip6link.exe - они разве не подойдут? И еще бы хотелось шаблончиков к make, наверняка параметров куча...

Alison 02.10.2006 17:07

Про обсуждаемый компилятор в VIP, который "поставляется в виде отдельного приложения".
Насколько я понимаю, это отдельное приложение, которое можно купить. В PE (и в CE) его нет.

TypucT 03.10.2006 15:38

Цитата:

Немножко неудачный пример. Здесь у тебя правило в виде факта. [...] Я имел ввиду правила вида P :- S,X,Y.
Отчего ж, можно использовать любой терм, никто не запрещает:
Код:

1 ?- read(X),assert(X).
|: hero(X):-tall(X).
X = hero(_G373):-tall(_G373);
No
2 ?- read(X),assert(X).
|: tall(giraffe).
X = tall(giraffe);
No
3 ?- hero(A).
A = giraffe;
No


Kurt_Rassel 04.10.2006 04:30

Цитата:

Отчего ж, можно использовать любой терм, никто не запрещает:
Код:

1 ?- read(X),assert(X).
|: hero(X):-tall(X).
X = hero(_G373):-tall(_G373);
No
2 ?- read(X),assert(X).
|: tall(giraffe).
X = tall(giraffe);
No
3 ?- hero(A).
A = giraffe;
No


И почему в VIPе такую возможность не сделали...

VictorY 07.10.2006 18:46

На мой комментарий
Цитата:

Ни в одной из версий Vip такой возможности нет.
В Vip для обеспечения такой возможности рекомендуется либо использовать поставляемый интерпретатор классического Пролога PIE, либо правила помещать в текстовый файл, включенный в проект DLL и затем этот проект компилировать на лету и вызывать эту DLL (компилятор в VIP поставляется в виде отдельного приложения).
поступило несколько вопросов.
Цитата:

Спасибо, интересная мысль, надо попробовать, правда компилер надо будет всегда держать под рукой (а он тяжеловат, с дллками). А в будещих версиях сей трабл не пофиксят? не в курсе?
Цитата:

Про обсуждаемый компилятор в VIP, который "поставляется в виде отдельного приложения".
Насколько я понимаю, это отдельное приложение, которое можно купить. В PE (и в CE) его нет.
Цитата:

Сорри еще один вопросик, насчет "компилятора в VIP поставляемого в виде отдельного приложения".
У меня установлен VIP7PE и в C:\Program Files\Visual Prolog 7.0\bin есть vip7compiler.exe и vip6link.exe - они разве не подойдут? И еще бы хотелось шаблончиков к make, наверняка параметров куча...
Прошу прощения за то, что не сразу отвечаю, проблемы со связью. Не буду отвечать на каждый вопрос по отдельности, проясню ситуацию и технологию.
В профессиональную версию (и только в нее!) входит замечательное приложение BIN/vipBuilder.exe.
Он запускается с параметром vipBuilder.exe <полное имя PRJ проекта>. Этот билдер можно запускать как из BAT (CMD) файла, так и по правилам запуска приложений из VIP. В результате проект будет построен в соответствии с установками, установленными в самом проектном файле. По поводу возможности поставки VipBuilder заказчику вместе с Вашим проектом - я не помню сейчас условий лицензии, но в любом случае, если реально потребуется, можно обратиться в PDC за разрешением.


Часовой пояс GMT +4, время: 01:27.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.