为什么L = [...]。源文件中不允许?

时间:2014-02-16 00:22:32

标签: prolog

我有一个很长的列表,我需要在数据库中声明。我不能写:

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

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

当我托盘进行编译时,会给出错误消息。如果我取消L = ...行就可以了。如何在源文件中声明列表?

2 个答案:

答案 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在他的回答中所解释的那样。

相关问题