10

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

X=[a,b,c].

我只是收到一个错误说

No permission to modify static_procedure `(=)/2'

prolog 不支持定义这样的变量吗?我在 linux 下使用 SWI-Prolog。

4

5 回答 5

21

在 Prolog 中,我们谈到逻辑变量,表示文字之间的同一性

也就是说,一个程序是一组规则,它们共同说明我们的文字的真实情况,并且文字是未解释的。我们使用变量编写规则来描述个人之间的关系,并且在尝试证明我们的查询是否可以成为真的时,Prolog将变量绑定为规则所指示的。

一个列表它只是一个术语(头部)和(注意这里的递归)一个列表之间的二元关系的语法糖。通常,当我们谈到数据库时,我们使用绑定原子文字的事实(没有主体的规则,始终为真)。

因此,该教程可能用与您报告的不同的词语来表达任务,或者它有些误导。无论如何,您都可以将列表存储在数据库中,如下所示:

mylist([a,b,c]).

并编写您的程序,例如:

myprog(X) :- mylist(L), member(X, L).

然后你可以像这样查询你的程序:

?- myprog(X).

和 Prolog,试图证明 myprog/1,试图证明 mylist/1member/2...为了证明 mylist(L),变量L 被绑定到 [a,b,c]。

高温高压

于 2012-04-10T11:26:49.660 回答
8

当你写

X = [a, b, c].

它被读作

=(X, [a, b, c]).

它被解读为关于=/2谓词的事实的定义。任何自由变量都等于 的事实[a, b, c]。也就是说,你重新定义=/2. 这显然不是你想要的!

你必须记住,在 Prolog 中,变量只在局部范围内,在谓词内。可行的是:

main :-
    X = [a, b, c],
    % do stuff with X.
于 2012-04-10T10:55:39.583 回答
2

我在linux下使用swipl,在prolog中定义一个列表。

mylist([element1,element2,elementn]).

然后你可以查询你的程序:

?- mylist(A).
于 2017-11-30T21:15:02.400 回答
1

不,你不能这样做。你基本上在写什么:

=(X,[a,b,x]).

正如错误所说,您无法重新定义 =/2

你可以做的是:

x([a,b,c]).

当你想使用 X 时:

...
x(X),
foo(X)
...
于 2012-04-10T10:54:18.753 回答
1

如果 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].
于 2019-04-28T18:23:09.263 回答