我有一个很长的列表,我需要在数据库中声明。我不能写:
L=[a,b,c,d,f].
f(t,g,r) :- w(L), ...
当我托盘进行编译时,会给出错误消息。如果我取消L = ...行就可以了。如何在源文件中声明列表?
答案 0 :(得分:3)
最好不要分配给全局变量,无论如何这是错误的语法。继续使用简单的Prolog,并添加一个包含长列表数据的“声明”谓词。
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).
答案 1 :(得分:0)
您的L=[a,b,c,d,f].
行尝试为(=)/2
标准内置谓词定义子句。由于通常无法重新定义内置谓词,因此在尝试编译文件时会收到权限错误。请注意,由于(=)/2
也被声明为中缀运算符,因此该行等同于:
'='(L, [a,b,c,d,f]).
如果您需要在文件中表示列表,您只需为它所代表的信息选择一个谓词名称,并为其添加一个事实,就像Carlo在他的回答中所解释的那样。