Prolog 中的更改值
Change value in Prolog
我是 Prolog 的新手,我想更改从列表中提取的变量的值。最初,变量是 n
,然后在某些情况下我想将其更改为 a
。但是使用 (is)/2
是行不通的,因为它只对数字进行操作。
有没有简单的方法来做到这一点?假设我的代码看起来像这样:
change([H|T]) :- set H to a,change(T).
change([]).
注意H
已经设置为n
,所以目标H = a
失败,因为n
和a
无法统一
你在学习序言时遇到了关键问题,它不像过程语言那样工作。
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.
我是 Prolog 的新手,我想更改从列表中提取的变量的值。最初,变量是 n
,然后在某些情况下我想将其更改为 a
。但是使用 (is)/2
是行不通的,因为它只对数字进行操作。
有没有简单的方法来做到这一点?假设我的代码看起来像这样:
change([H|T]) :- set H to a,change(T).
change([]).
注意H
已经设置为n
,所以目标H = a
失败,因为n
和a
无法统一
你在学习序言时遇到了关键问题,它不像过程语言那样工作。
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.