gpt4 book ai didi

list - 有没有办法使用 write/1 来编写 length/1 谓词来打印结果?

转载 作者:行者123 更新时间:2023-12-02 08:24:00 27 4
gpt4 key购买 nike

我有一个学校作业,最近开始学习Prolog。
这是练习(非常简单):

Write a program in Prolog to find a length of a given list. For example, length([a, b, c, d, e]). should print 5

我真的不知道如何创建一个 length/1 谓词来为我做这件事。这是我的代码:

length([],0).
length([_|T],N) :- length(T,X), N is X+1.

现在,我问我的老师如何将其转换为 length/1 谓词,他告诉我使用 write/1 谓词。我查找了 write/1 谓词,但我看不出这将如何帮助我编写 length/1 谓词。有什么提示/技巧可以做到这一点吗?
需要明确的是,这是作业。

最佳答案

解决方案很简单:impure(Ls) :- length(Ls, L), write(L).

但是,由于多种原因,这是一个非常糟糕的想法

一个非常重要的一点是,只出现在屏幕上的东西在 Prolog 中无法被推理!

因此,如果您只是使用 write/1 写入一些结果,您无法真正运行自动测试用例来查看您的谓词是否确实按预期运行。这样至少编写测试变得更难

相比之下,使用原始的、更纯净 的代码版本(未使用副作用),您可以轻松地进行测试,例如:

?- length([a,b,c], 3).true.

并且还自动运行了几个这样的测试用例,并使用Prolog看它们是否成功。例如,一批 10,000 个测试用例可能看起来像(搜索反例):

?- between(1, 10_000, L), length(Ls, L),  length([_|Ls], L1), L1 =\= L+1.false.

相比之下,您如何测试不纯谓词?

?- between(1, 10_000, L), length(Ls, L),  impure([_|Ls])  what now??

如您所见,很难推理谓词的输出!

此外,这使您的谓词比当前版本更不通用!您不能再在其他方向使用不纯版本。例如,您现在如何生成给定长度的列表?无法提供长度!

保持纯粹的人,使用 Prolog 顶层来获取答案,而不是在屏幕上自己写!

关于list - 有没有办法使用 write/1 来编写 length/1 谓词来打印结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33920611/

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