问题标签 [logical-purity]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
prolog - 序言中的“如果”?
有没有办法在 prolog 中执行 if,例如,如果变量为 0,则执行一些操作(将文本写入终端)。甚至不需要 else,但我找不到任何有关 if 的文档。
prolog - 使用 \==/2 或 diff/2
如果我想确保两个变量不会实例化为同一个术语,那么首选的方法是什么?
假设我需要在图中找到有向边,并且节点不能对自身有边:
(这里的边是 a -> c,b -> a,但不是c -> c)
以下作品:
这也有效[swi-prolog]:
这显然不起作用(因为 A 和 B 都没有被实例化?):
我想我对第一个解决方案的问题是,对于更复杂的谓词,在失败node
之前可能会发生许多不必要的统一。另一方面,在一个库中,这表明它不适合在如此简单的情况下使用(尽管它具有我似乎正在寻找的确切功能)edge
。dif
prolog - 好的 Prolog 代码的特点?
编写好的 Prolog 必须掌握哪些设计启发式方法?我听说一个有经验的程序员需要大约两年的时间才能精通 Prolog。有效地使用递归是其中的一部分,但这似乎是一个相对较小的障碍。到底是什么给程序员带来了这么多麻烦?我应该在示例代码中寻找什么来判断它的质量?
prolog - 为什么 SWI-Prolog 只提供一种解决方案?
老实说,我是 Prolog 新手,所以请原谅我的无知。
我有一个简单的谓词来计算列表中原子的出现次数,如下所示:
以下查询返回正确的结果:
但是,如果我试图找到所有可能的解决方案,它只会给出一个。
我如何得到它来提供所有的解决方案?我虽然它可能与 cut 运算符有关,但删除它似乎也不起作用。
prolog - 使用不纯原语的 Prolog 谓词的纯度
我知道var/1
,nonvar/1
并且!/0
是不纯的原语,但是它们的使用是否会使每个使用它们的程序不纯?
我写了下面的谓词plus/3
,它的行为就好像它是纯的,或者至少是我所声称的。谓词是说明性的,并非旨在高效。
我有两个问题:
- 上面的谓词
plus/3
真的是纯的吗? - 一般来说,你如何证明一个特定的关系具有逻辑纯度?
这个问题在关于这个答案的讨论之后。
prolog - Prolog 中的协程:当参数是一个列表时(它具有固定长度)
问题
一旦列表的长度已知/固定,是否可以安排目标执行,或者正如@false 在评论中指出的那样,给定的参数变成 [proper] 列表?沿着这条线的东西:
何时条件可以使用?=/2
, nonvar/1
, ground/1
, ,/2
, and ;/2
only 来构造,并且在查看整个列表时它们似乎不是很有用。
作为进一步的细节,如果可能的话,我正在寻找一种呈现逻辑纯度的解决方案。
动机
我认为当人们想要使用谓词p(L)
来检查 list 的属性L
但不以生成方式使用它时,此条件可能很有用。
例如,[出于效率或终止原因]如果具有固定长度(即是一个列表),则可能会更喜欢p1(L), p2(L)
按此顺序执行以下连词,否则以相反的顺序执行(如果是部分列表)。L
L
p2(L), p1(L)
L
这可能是这样实现的:
更新
我确实实施了一个解决方案,但它缺乏纯度。
list - append/3 的具体谓词变体的冗余答案
我想为 这个论坛中的其他一些最近的问题提供一个逻辑上纯粹的解决方案。
首先,我实现了一个具体化的变体append/3
并将其命名为appendR/4
. 它基于谓词if_/3
并由(=)/3
AUBUC 的Prolog union 中的 @false 实现:
该实现基本上可以工作,如以下查询所示:
到目前为止,一切都很好......这是棘手的部分:
我想得到前两个答案,但不是最后两个。请帮忙!
prolog - different/2 - 是否存在纯粹的、确定的定义?
虽然从声明的角度来看,这个定义使用member/2
andnon_member/2
几乎是1完美的,但它为某些查询产生了冗余的解决方案,并在周围留下了选择点。
什么是在此基础上改进的定义(以纯粹的方式可能使用if_/3
and (=)/3
)使得完全相同的一组解决方案被描述different/2
但至少对于地面查询是确定的(因此不会留下任何无用的选择点)并省略(如果可能)任何多余的答案?
1
其实,different([a|nonlist],[]), different([],[b|nonlist])
成功了。它同样可能失败。因此,两者都失败的解决方案很好(甚至更好)。