- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个学校作业,最近开始学习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/
我是一名优秀的程序员,十分优秀!