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