我是 prolog 编程的新手,并且在教程中被告知要定义结构列表(在脚本中),以便我可以将其作为数据库进行查询。但是我发现不可能将此列表定义为脚本中的变量。当我定义一个列表时,例如
X=[a,b,c].
我只是收到一个错误说
No permission to modify static_procedure `(=)/2'
prolog 不支持定义这样的变量吗?我在 linux 下使用 SWI-Prolog。
在 Prolog 中,我们谈到逻辑变量,表示文字之间的同一性。
也就是说,一个程序是一组规则,它们共同说明我们的文字的真实情况,并且文字是未解释的。我们使用变量编写规则来描述个人之间的关系,并且在尝试证明我们的查询是否可以成为真的时,Prolog将变量绑定为规则所指示的。
一个列表它只是一个术语(头部)和(注意这里的递归)一个列表之间的二元关系的语法糖。通常,当我们谈到数据库时,我们使用绑定原子文字的事实(没有主体的规则,始终为真)。
因此,该教程可能用与您报告的不同的词语来表达任务,或者它有些误导。无论如何,您都可以将列表存储在数据库中,如下所示:
mylist([a,b,c]).
并编写您的程序,例如:
myprog(X) :- mylist(L), member(X, L).
然后你可以像这样查询你的程序:
?- myprog(X).
和 Prolog,试图证明 myprog/1,试图证明 mylist/1和member/2...为了证明 mylist(L),变量L 被绑定到 [a,b,c]。
高温高压
当你写
X = [a, b, c].
它被读作
=(X, [a, b, c]).
它被解读为关于=/2
谓词的事实的定义。任何自由变量都等于 的事实[a, b, c]
。也就是说,你重新定义=/2
. 这显然不是你想要的!
你必须记住,在 Prolog 中,变量只在局部范围内,在谓词内。可行的是:
main :-
X = [a, b, c],
% do stuff with X.
我在linux下使用swipl,在prolog中定义一个列表。
mylist([element1,element2,elementn]).
然后你可以查询你的程序:
?- mylist(A).
不,你不能这样做。你基本上在写什么:
=(X,[a,b,x]).
正如错误所说,您无法重新定义 =/2
你可以做的是:
x([a,b,c]).
当你想使用 X 时:
...
x(X),
foo(X)
...
如果 Y = [a,b,c],在函数 makeList(Y,F) 函数调用之后,F = [a,b,c]
makeList(Y,F) :-
append(Y,[],X),
F = X.
例如)
?- makeList([a,b,c],X).
X = [a,b,c].