Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 在prolog脚本中定义列表_List_Variables_Prolog - Fatal编程技术网

List 在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]). 正如错误所说,您不能重新定义=

我是prolog编程新手,在一个教程中我被告知要定义一个结构列表(在脚本中),以便我可以将其作为数据库查询。但是,我发现不可能将此列表定义为脚本中的变量。当我定义一个列表时,例如

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)