在Prolog中更改值

在Prolog中更改值,prolog,Prolog,我不熟悉Prolog,我想更改从列表中提取的变量的值。最初,变量是n,然后在某些情况下,我想将其更改为a。但是使用(is)/2是行不通的,因为它只对数字进行操作 有没有一个简单的方法可以做到这一点?假设我的代码如下所示: change([H|T]) :- set H to a,change(T). change([]). 请注意,H已设置为n,因此目标H=a失败,因为n和a无法统一。在学习prolog时,您遇到了一个关键问题,即它不像过程语言那样工作 prolog中的变量是一个变量,它可以有任

我不熟悉Prolog,我想更改从列表中提取的变量的值。最初,变量是
n
,然后在某些情况下,我想将其更改为
a
。但是使用
(is)/2
是行不通的,因为它只对数字进行操作

有没有一个简单的方法可以做到这一点?假设我的代码如下所示:

change([H|T]) :- set H to a,change(T).
change([]).

请注意,
H
已设置为
n
,因此目标
H=a
失败,因为
n
a
无法统一。

在学习prolog时,您遇到了一个关键问题,即它不像过程语言那样工作

prolog中的变量是一个变量,它可以有任何值,但在计算中的任何一点上,如果变量已统一,则除非prolog回溯,否则它不能更改

因此,您不能简单地获取一个列表,例如
[m,n,o,p]
,然后将其更改为
[m,a,o,p]
。你必须建立一个新的列表

以下是方法:

replace_n_with_a([], []).
replace_n_with_a([n|X], [a|Y]) :- replace_n_with_a(X, Y).
replace_n_with_a([H|X], [H|Y]) :- H \= n, replace_n_with_a(X, Y).
这三个谓词获取一个列表并构建一个新的列表,但只要找到它,就会将
n
替换为
a
。原来的列表没有改变,但我现在有了一个新的列表,可以传递到代码的下一部分

要运行上述代码,您可能需要:

?- replace_n_with_a([m, n, o, p], Xs), write(Xs), nl.
我得到这个结果:

[m, a, o, p]
Yes.

你能展示你试图写的代码来建立一些上下文吗<代码>is/2无论如何都不适用于“分配”。它用于算术表达式求值。在Prolog中,谓词不是函数(行为上不是同一事物),并且统一(使用
=/2
)不是赋值(行为上也不是同一事物)。
将H设置为a
是无效的Prolog语法。你有一本Prolog的书吗?或者你有没有学习过基本的Prolog教程?如果
H
已经有一个值,那么您不能在该上下文中将新值分配给
H
。要更改这样的列表,您需要生成一个新列表,
change(OldList,NewList)
。真的,为什么我们不能为它指定一个新值?这似乎不太方便,因为正如我提到的,这不是任务,而是统一。Prolog不是一种过程性的命令式语言。它是声明性的,使用逻辑和回溯。Prolog谓词用于确定查询是否为真,如果不能,则会失败。当一个变量被统一时,逻辑要求它的值不被改变(除非通过回溯),否则逻辑将变得无效。想象一下,与不断改变假设的人进行逻辑辩论。你走不了多远。当您理解Prolog时,实际上很方便的是变量不能更改。:)如果你想学习这门语言,我强烈建议你买一本好的序言书,比如《序言的艺术》。许多初学者尝试用Prolog做他们用其他语言做的事情,并且用同样的方式,但这不是同一种工具。因此,初学者会感到沮丧,并认为该语言限制性强或过于奇特,因为它不适合他们的编程模式。但是仔细研究一下,你就会明白。