gpt4 book ai didi

list - 如何在prolog中创建全局变量

转载 作者:行者123 更新时间:2023-12-04 19:15:00 25 4
gpt4 key购买 nike

我有一个我创建的列表如下:

tab([(top,left),(top,middle),(top,right),(center,left),(center,middle),
(center,right),(bottom,left),(bottom,middle),(bottom,right)]).

我希望创建一个全局变量 AllPosition,它是一个选项卡。所以我做了以下事情:
tab(AllPos).

这是正确的吗?

然后我必须遵循问题:
我有一个函数可以接收选项卡中的一对。我希望删除。所以我这样做了:
place(Line, Column, Tab) :-
AllPos \== [_,_] /*while AllPos isn't empty - not sur if this is done this way*/ -> (member((Line,Column), AllPos) -> (erase(AllPos, (Line,Column), AllPos)).

哪里 erase(List, Element, NewList)从 List 中删除元素 Element 并创建一个新列表 NewList 等于 List 但没有 Element。两个函数 membererase正在工作。

问题是...正如您可能已经注意到的那样,我使用 AllPos到处。那是因为我想,我想修改它,以便我以后可以在另一个函数中使用它(在从中删除了一些元素之后)。我的逻辑对吗?我可以在另一个函数中使用修改后的 AllPos 吗?
谢谢

最佳答案

在 SWI-Prolog 中,您可以使用:b_setval(name, value)b_getval(name, value) .如果您不希望在回溯的情况下将值更改回来,您可以使用以下命令使它们成为实际全局的:nb_setval(name, value)nb_getval(name, value) .

因此,例如,如果您有一个程序并且您想检查它通过某个路径的频率,您可以使用:

recursive(100).
recursive(X) :- add, Y is X + 1, recursive(Y).

add :- nb_getval(counter, C), CNew is C + 1, nb_setval(counter, CNew).

testRecursion
:-
% Set counter to zero
nb_setval(counter, 0),

% Run some code with 'add'
recursive(0), !,

% Print the results
nb_getval(counter, CounterValue),
write('Steps: '), writeln(CounterValue).

这对于一些实验案例来说是好的,但通常你会想要避免 Prolog 中的全局变量,因为 Prolog 意味着逻辑编程。

关于list - 如何在prolog中创建全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10655013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com