在prolog脚本中定义列表

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


m09*_*m09 6

当你写作

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)