2014-02-16 7 views
1

У меня есть длинный список, который мне нужно объявить в базе данных. Не могу написать:Почему L = [...]. не разрешено в исходном файле?

L=[a,b,c,d,f]. 

f(t,g,r) :- w(L), ... 

Когда я лоток для компиляции, он выдает сообщение об ошибке. Если я отменяю строку L = ..., это нормально. Как объявить список в исходном файле?

ответ

3

Лучше не назначать глобальную переменную, и в любом случае это неправильный синтаксис. Оставайтесь с простым прологом и добавляйте предикат «объявления», в котором хранятся данные длинного списка.

my_list([a,b,c,d,f]). 

, который будет использоваться как

f(t,g,r) :- my_list(L), w(L), ... 

Если вы хотите также использовать существование данных как «сделано» флаг, вы можете использовать шаблон

f(t,g,r) :- (retract(my_list(L))-> w(L) ; already_done_no_L_available), ... 

но тогда вам понадобится заявка

:- dynamic(my_list/1). 
0

Ваша линия L=[a,b,c,d,f]. пытается определить предложение для стандартного встроенного предиката (=)/2. Поскольку встроенные предикаты обычно не могут быть переопределены, вы получаете ошибку разрешения при попытке скомпилировать файл. Обратите внимание, что, как (=)/2 также объявлен как оператор инфиксной, что линия эквивалентна:

'='(L, [a,b,c,d,f]). 

Если вам необходимо представить список в файл, вы можете просто выбрать имя предиката для информации, которую он представляет и добавьте факт для него, как объяснил Карло в своем ответе.

Смежные вопросы