woo*_*zle 9 variables list prolog
我是prolog编程的新手,并在教程中被告知定义结构列表(在脚本中),以便我可以将其作为数据库进行查询.但是我发现无法将此列表定义为脚本中的变量.当我定义一个列表如
X=[a,b,c].
Run Code Online (Sandbox Code Playgroud)
我只是收到一个错误说
No permission to modify static_procedure `(=)/2'
Run Code Online (Sandbox Code Playgroud)
prolog不支持定义这样的变量吗?我在linux下使用SWI-Prolog.
Cap*_*liC 20
在Prolog中,我们谈到逻辑变量,意思是文字之间的同一性.
也就是说,一个程序是一组规则,它们共同说明我们的文字是什么,并且文字是未被解释的.我们使用变量来编写规则来描述关于个体的关系,并且在试图证明我们的查询是否可以成为真时,Prolog会根据规则的规定来绑定变量.
一个列表它是一个项(之间的二元关系只是语法糖头)和(这里要注意的递归)一个列表.通常,当我们谈论数据库时,我们使用绑定原子文字的事实(没有正文的规则,总是如此).
所以该教程可能用不同于你报告的单词来表达任务,或者它有点误导.无论如何,您可以在数据库中存储列表:
mylist([a,b,c]).
Run Code Online (Sandbox Code Playgroud)
并编写你的程序,如:
myprog(X) :- mylist(L), member(X, L).
Run Code Online (Sandbox Code Playgroud)
然后你可以查询你的程序,如:
?- myprog(X).
Run Code Online (Sandbox Code Playgroud)
和Prolog,试图证明myprog/1,试图证明mylist/1 和 member/2 ...为了证明mylist(L),变量 L被绑定到[a,b,c].
HTH
当你写作
X = [a, b, c].
Run Code Online (Sandbox Code Playgroud)
它被解读为
=(X, [a, b, c]).
Run Code Online (Sandbox Code Playgroud)
这被解读为关于=/2
谓词的事实的定义.任何自由变量等于的事实[a, b, c]
.也就是说,你重新定义=/2
.那显然不是你想要的!
您必须在Prolog中记住,变量仅限于本地范围内的谓词.有用的是:
main :-
X = [a, b, c],
% do stuff with X.
Run Code Online (Sandbox Code Playgroud)