2016-05-29 6 views
2

Я пытаюсь использовать часть программного обеспечения, и у меня возникают проблемы.Преобразование из строки в список в Prolog

Следует отметить, что с использованием университетских компьютеров с предустановленными прогонами (OSX) или компьютерами Windows работает тот же самый программный продукт. Хотя это не работает на моей машине Linux/Ubuntu.

Программа запускается с Баш скрипт, используя эту форму:

echo "reset_statistics(off), specific_load_predicate(filename), tokenize(\"$2\", List), tex(List, $3)." | ./prolog-executable 

Пролог исполняемым создается с помощью swipl -c и qsave_program/1

Теперь я узнал, что предикат разметить имеет вид:

tokenize([A|As], List) :- ... 

Так что он принимает список в качестве входных данных, но сценарий bash предоставляет строку.

Возможно ли использовать какой-либо пролог-модуль или расширение, которое автоматически преобразует строку из строки в список? Потому что тот же код работает на других компьютерах.

+1

В SWI-Prolog установите флаг Prolog 'double_quotes' в' chars' (рекомендуется) или 'codes', чтобы превратить все в двойные кавычки в список символов или кодов. Вот как это ** должно было ** быть в первую очередь, и что также делают другие системы Prolog. Вы также можете использовать опцию командной строки '--traditional' для получения стандартного поведения в этом отношении. – mat

+0

@mat Отлично! это был тот ответ, который я искал. Он работает, когда я запускаю swipl с --traditional, но он не работает со всеми используемыми сценариями bash, есть ли способ установить его в масштабе всей системы? – Xeli

+1

Вы можете добавить псевдоним Bash, например: 'alias swipl = '/ usr/local/bin/swipl --traditional'', или поместить': - set_prolog_flag (double_quotes, chars) .' в ваш '~/.swiplrc '. Обратите внимание, что все это приводит к чрезвычайно забавным ситуациям, когда ваш инструктор использует другой способ для вызова SWI-Prolog. Это почти так, как будто для Prolog должен быть стандарт! – mat

ответ

2

SWI-Prolog, к сожалению, не отличается от   стандарта ISO Prolog в том, что в окружении двойных кавычек   больше не список характера   коды.

Чтобы восстановить совместимое поведение в этом отношении, используйте один из следующих способов:

  1. вызова SWI-Prolog с --traditional флагом
  2. добавить :- initialization(set_prolog_flag(double_quotes, codes)). в исходный файл.
  3. добавить :- set_prolog_flag(double_quotes, codes). в ваш файл инициализации ~/.swiplrc.

В самом деле, вместо того, чтобы идти со списками кодов символов, я рекомендую взять другой маршрут в целом и адаптировать свои программы для использования списков символов, что означает, что каждый символ представлен в   атоме. Это имеет большое преимущество в том, что ответы на вопросы остаются очень похожими на то, что появляется в запросах, и на самом деле вполне читаемы сами по себе. Вы получаете списки символов, например, помещая:

 
:- set_prolog_flag(double_quotes, chars). 

в файле ~/.swiplrc инициализации. При значении символов, вы получите, например:

 
?- Cs = "hello". 
Cs = [h, e, l, l, o]. 

Я рекомендую вам использовать это значение, и адаптировать существующие программы для работы со списками символов. Долгосрочный, я думаю, что это будет самый лучший и наиболее широко используемый подход, который исторически также заключался в том, что двойные кавычки были означало обозначать.

Пока мы не вернемся туда, вы можете использовать один из методов выше (т.Переключитесь кодов в качестве промежуточного решения, по крайней мере, работы вокруг проблем, введенных SWI   7), а затем адаптировать свои библиотеки для работы с кодами и символов, а затем, наконец, переключатель для символов.