gpt4 book ai didi

prolog - 计算列表中元素的数量 : how affectation works

转载 作者:行者123 更新时间:2023-12-04 15:09:24 29 4
gpt4 key购买 nike

我正在研究一个 Prolog 问题,包括计算列表元素的数量:

count([], 0).
count([H|T], N) :-
count(T, X),
N is X+1,
N > 0.

我能理解为什么这样写,但我不明白为什么我们不能用 替换 N is X+1| X 是 N-1 ?

非常感谢!

最佳答案

您的问题非常合理,+1。

这个看似随意的选择的原因是(is)/2是一个相对低级的谓词,只在非常特殊的情况下有效,只能从程序上理解,不能从声明上理解。因此,(is)/2对于初学者来说非常难理解,最好避免,因为它破坏了我们在使用 Prolog 时想要享受的许多关系属性。

声明式解决方案是使用 约束 ,在那里你可以完全按照你说的去做。对于整数关系,只需替换 (is)/2来自 (#=)/2享受您直观期望的关系属性。

例如,使用 GNU Prolog:

计数([],0)。
计数([_|Ls], N) :-
计数(Ls,X),
X #= N - 1,
N#> 0。

在 SICStus Prolog 和 SWI 等其他系统中,您目前仍然需要使用 library(clpfd)为了这。此外,我强烈建议为这种关系使用一个更具声明性的名称,明确哪个参数表示什么:

:- use_module(library(clpfd))。

列表长度([],0)。
list_length([_|Ls], N) :-
列表长度(Ls,X),
X #= N - 1,
N#> 0。

示例查询:

?- list_length([_,_,_], N)。
N = 3。

?- list_length(Ls, 2)。
Ls = [_G602, _G605] 。

我把改进这个谓词的终止属性作为一个简单的练习。

关于prolog - 计算列表中元素的数量 : how affectation works,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35633122/

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