Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Prolog > Коммандный файл для SWI в Windows


Автор: tumanovalex 29.9.2011, 10:59
Есть программа на SWI (кусок из нее) в файле my.pl:
Код
родитель('Петр', 'Алексей').
родитель('Галина', 'Алексей').
родитель('Владимир', 'Елена').
родитель('Наталья', 'Елена').
родитель('Алексей', 'Мария').
родитель('Елена', 'Мария').
ребенок(Y, X)      :- родитель( X, Y).
потомок(X, Y)      :- родитель(Y, X).
потомок(X, Z)      :- ребенок(X, Y), потомок(Y, Z).
предок(X, Z)       :- родитель(X, Z).
предок(X, Z)       :- родитель(X, Y), предок( Y, Z).
С помощью Consult я загружаю этот файл и после приглашения ввожу: предок(X, 'Мария'). и получаю список предков. Затем ввожу потомок(X, 'Петр'). и получаю список потомков. А можно ли создать файл с командами для SWI, при двойном щелчке на котором загружался бы файл my.pl, из коммандного файла брались бы цели и в SWI появлялся результат?

Автор: tap1956 29.9.2011, 11:26
Мне тоже это очень интересно.

Автор: Cheloveck 29.9.2011, 12:07
Люди! Читайте документацию перед тем, как задавать вопросы!
http://www.swi-prolog.org/pldoc/doc_for?object=section%282,%272.4%27,swi%28%27/doc/Manual/cmdline.html%27%29%29
Цитата

2.4.2 Running goals from the commandline

-g goal
    Goal is executed just before entering the top level. Default is a predicate which prints the welcome message. The welcome message can be be suppressed with --quiet, but also with -g true. goal can be a complex term. In this case quotes are normally needed to protect it from being expanded by the shell. A safe way to run a goal non-interactively is here:

    % swipl <options> -g go,halt -t 'halt(1)'

-t goal
    Use goal as interactive top-level instead of the default goal prolog/0. goal can be a complex term. If the top-level goal succeeds SWI-Prolog exits with status 0. If it fails the exit status is 1. If the toplevel raises an exception, this is printed as an uncaught error and the toplevel is restarted. This flag also determines the goal started by break/0 and abort/0. If you want to stop the user from entering interactive mode start the application with `-g goal' and give `halt' as top-level. 

Автор: tumanovalex 29.9.2011, 22:26
Прочитал, но видимо не понял. Сделал bat-файл со строкой 
Код
swipl -s my.pl -t 'предок(X, 'Мария')'.
, пишет, что ошибка окончания файла строки с кавычками. Как все-таки в моем случае слелать коммандный файл?

Автор: Фантом 29.9.2011, 22:51
Цитата(tumanovalex @  29.9.2011,  22:26 Найти цитируемый пост)
Как все-таки в моем случае слелать коммандный файл?


Сделайте в программе дополнительную служебную цель без аргументов (пусть она называется goal, это не обязательно, но общепринято), вставьте в нее вызов того, что Вам хочется, а потом вызов halt. Т.е. что-то вроде
Код

goal :- предок(X, 'Мария'),halt.


А затем в консоли наберите swipl -g goal -o result -c my.pl

Часть -o result необязательна - это задание имени для исполняемого файла ("result"). Если это убрать, получится, как обычно, "a.out".

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)