gpt4 book ai didi

prolog - 在编写纯关系型序言程序时,可以使用仔细放置的剪切吗?

转载 作者:行者123 更新时间:2023-12-02 06:49:12 25 4
gpt4 key购买 nike

我正在尝试编写一个管理键值存储的关系序言程序。初始代码取 self 在互联网上找到的一些讲座幻灯片(http://people.eng.unimelb.edu.au/pstuckey/book/course.html - 请参阅:使用数据结构幻灯片)。

newdic([]).
addkey(D0,K,I,D) :- D = [p(K,I)|D0].
delkey([],_,[]).
delkey([p(K,_)|D],K,D).
delkey([p(K0,I)|D0],K,[p(K0,I)|D]) :-
dif(K, K0), delkey(D0,K,D).

这段代码允许使用相同的键添加多个值——这对我来说没问题。但是,它还会添加相同的键、值对两次,例如

?- newdic(D), addkey(D, a, 1, D2), addkey(D2, a, 1, D3), lookup(D3, a, X).
D = [],
D2 = [p(a, 1)],
D3 = [p(a, 1), p(a, 1)],
X = 1

D3 包含 p(a,1) 两次。

为了确保这种情况不会发生,我添加了以下代码;为了确保回溯不会找到替代的 addkey 子句,我在第一个子句的末尾添加了一个切口。

对于纯粹的关系程序来说,这是公平的游戏吗?或者是确保不添加重复键、值对的更好方法,而不使用剪切。

newdic([]).
addkey(D0,K,I,D0) :- lookup(D0, K, I), !. % if the key already do nothing
addkey(D0,K,I,D) :- D = [p(K,I)|D0].
delkey([],_,[]).
delkey([p(K,_)|D],K,D).
delkey([p(K0,I)|D0],K,[p(K0,I)|D]) :-
dif(K, K0), delkey(D0,K,D).

这会导致以下结果:

?- newdic(D), addkey(D, a, 1, D2), addkey(D2, a, 1, D3), lookup(D3, a, X).
D = [],
D2 = D3, D3 = [p(a, 1)],
X = 1.

不,还有更多解决方案可用 - 程序立即返回。

非常感谢任何建议,

丹尼尔

注意:顺便说一句:如果我为同一键添加不同的值,则剪切确实允许回溯以识别同一键的第二个值:

?- newdic(D), addkey(D, a, 1, D2), addkey(D2, a, 1, D3), addkey(D3, a, 2, D4), lookup(D4, a, X).
D = [],
D2 = D3, D3 = [p(a, 1)],
D4 = [p(a, 2), p(a, 1)],
X = 2 ;
D = [],
D2 = D3, D3 = [p(a, 1)],
D4 = [p(a, 2), p(a, 1)],
X = 1.

最佳答案

SWI Prolog 具有用于处理键值对和关联的库谓词。我没有仔细研究它们以了解哪些可能符合您的情况,但需要考虑一些事情。

如果您想推出自己的解决方案,您可以递归地编写 addkey/4 并维护关系行为:

addkey([], K, V, [p(K,V)]).             % Add to empty dict
addkey([p(K,V)|T], K, _, [p(K,V)|T]). % Don't add
addkey([p(K,V)|T], Kadd, Vadd, [p(K,V)|TK]) :-
dif(Kadd, K),
addkey(T, Kadd, Vadd, TK).

如果键是唯一的,则此实现会添加。如果您尝试使用相同的键,即使具有不同的值(这通常是键值对字典的行为方式),它会忽略添加并生成相同的字典。您可以很容易地增强它的键值对的唯一性。当然,您使用的 Prolog 需要包含 dif/2,或者您需要推出自己的 dif/2。 :)

关于prolog - 在编写纯关系型序言程序时,可以使用仔细放置的剪切吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47635627/

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