2015-02-21 3 views
1

I установки следующие правила, чтобы найти, если существует связь между двумя элементами:Как настроить PrologScript

directReference(A,B) :- projectReferences(A,B). 
transitiveReference(A,C) :- directReference(A,B),directReference(B,C). 
transitiveReferenceD1(A,D) :- transitiveReference(A,C),directReference(C,D). 
transitiveReferenceD2(A,E) :- transitiveReferenceD1(A,D),directReference(D,E). 

Могу ли я написать PrologScript, которая будет проверять все эти запросы на факт? Хотя я планирую использовать Ruby Rake, кто-то пытается сделать неинтерактивный вызов с PHP here, и он не сработал. Я также видел this answer и пробовал ответить Каарелю. Я просто добавил новый opts_spec:

opts_spec(
    [ [opt(day), type(atom), 
     shortflags([d]), longflags(['term', 'day']), 
     help('name of day')] 

    , [opt(goal), 
     shortflags([g]), longflags([goal]), 
     help('goal to be called')] 

    , [opt(projectReferences), type(atom), 
     shortflags([pr]), longflags(['term', 'projectReferences']), 
     help('Project Reference lookup')] 
    ] 
). 

Я скомпилирован с:

.\swipl.exe -o day.exe -g main -c "D:\DevProjects\AskJoe\Output\Sample.pro"

И побежал с:

./day.exe -g "day(Sunday)"

И получил ошибку:

ERROR: Prolog initialisation failed: ERROR: validate_opts_spec/1: Domain error: unique_atom' expected, found term' (ambiguous flag)

Моя цель состоит в том, чтобы эта работа:

./day.exe -g "transitiveReference('a','b')"

мне не нравится компиляции «day.exe», чтобы запустить скрипт (according to the docs это часто не нужно), но я не нашел другой способ передать аргументы правилам.

Я видел basic intro на swi-pl.org, что не помогло. Он не объясняет, как сделать скачок из примера файла script.sh для выполнения ./eval 1+2. На самом деле, пример - комментарий, поэтому я полностью потерял

+0

Я считаю, '. \ swipl.exe' необходим только для систем Windows. –

ответ

1

Вот очень грубый пример программы PrologScript, который будет читать свои аргументы как единую цель (которая может быть сложной), называть ее, а затем завершать , Он должен работать на системах * NIX, и был протестирован на OS X. Это лишь небольшое изменение example program с учетом использования PrologScript в документации SWI:

#!/usr/bin/env swipl 

:- initialization main. 

query :- 
     current_prolog_flag(argv, Argv), 
     concat_atom(Argv, ' ', Atom), 
     read_term_from_atom(Atom, Term, []), 
     call(Term). 

main :- 
     catch(query, E, (print_message(error, E), fail)), 
     halt. 
main :- 
     halt(1). 


projectReferences(valueA, valueB) :- writeln('I was called!'). 
directReference(A,B) :- projectReferences(A,B). 
transitiveReference(A,C) :- directReference(A,B),directReference(B,C). 
transitiveReferenceD1(A,D) :- transitiveReference(A,C),directReference(C,D). 
transitiveReferenceD2(A,E) :- transitiveReferenceD1(A,D),directReference(D,E). 

После сохранения этого файла, как, например, cli_test.pl , вам необходимо изменить права доступа к файлу, так что операционная система распознает его как исполняемый файл:

chmod -x scratchboard.pl 

После этого, вы должны быть в состоянии назвать файл, как обычный исполняемый файл с помощью команды line:

$ path/to/the/file/scratchboard.pl 'transitiveReferenceD1(A,D).' 
I was called! 

Примечание:

  • Цель будет оцениваться просто передается как один аргумент. query/0 затем извлечет этот аргумент с помощью current_prolog_flag/2, прочитайте его как пролог и назовите его.
  • Поскольку программа не работает в интерактивном режиме, единственный выход будет вызван явными императивами для записи, например, если catch/3 (в теле main/0) инициируется ошибкой или если projectReferences/2 называется успешно.

Использование library(optparse) представляется целесообразным для более сложного интерфейса cli, но не обязательно для вашей заявленной цели просто запрашивать цели в файле.

Я понимаю, что использование подхода PrologScript для работы в Windows несколько отличается. Немного информации здесь можно найти здесь: http://www.swi-prolog.org/FAQ/PrologScript.html

+1

Я использую OSX. Я скопировал код и сохранил его как 'script3.pl'. Затем я выполняю его в bash с помощью 'sudo ./script3.pl 'transitiveReferenceD1 (A, D).'' И получаем 'command not found'. Я запускал 'which swipl' и получал'/usr/local/bin/swipl', поэтому я попробовал '#!/Usr/local/bin swipl' и получил' command not found'. –

+1

@ P.Brian.Mackey hmm ... единственное, что я могу думать сразу с места в карьер: вы предоставили исполняемые разрешения файла с помощью '$ chmod + x script3.pl'? –

+1

О! Так что это работает! Большой! Я добавлю этот бит инструкции к моему ответу и предлагаю изменить его в документах SWI. В прошлом я столкнулся с этим камнем преткновения. Слишком легко для тех, кто пишет документацию, и дает советы, чтобы забыть, сколько «очевидных» деталей очевидны только после повторного использования. –

0

Так что я получил все это, и после нескольких запусков все просто остановилось. Я начал получать ошибки «отказ от неправильного интерпретатора». Все, что я могу сказать, это то, что это имеет какое-то отношение к hashBang. Обходной путь для меня, чтобы создать сценарий оболочки вокруг вызова swipl:

shellscript.sh

#!/bin/bash 
swipl -s script4.pl 'projectReferences(A,D).' 

Тогда я продолжал использовать пример aBathologist, но просто снял hashBang:

:- initialization main. 

query :- 
     current_prolog_flag(argv, Argv), 
     concat_atom(Argv, ' ', Atom), 
     read_term_from_atom(Atom, Term, []), 
     call(Term). 

main :- 
     catch(query, E, (print_message(error, E), fail)), 
     halt. 
main :- 
     halt(1). 


projectReferences(valueA, valueB) :- writeln('I was called!'). 
directReference(A,B) :- projectReferences(A,B). 
transitiveReference(A,C) :- directReference(A,B),directReference(B,C). 
transitiveReferenceD1(A,D) :- transitiveReference(A,C),directReference(C,D). 
transitiveReferenceD2(A,E) :- transitiveReferenceD1(A,D),directReference(D,E). 
Смежные вопросы