大佬教程收集整理的这篇文章主要介绍了如何在Prolog中获得not效果,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试创建一个递归调用自身的规则,并找到遍历有向图的所有可能路径。我正在使用 findall()
这样做。函数是traverse(Start,End)
。
我有:
traverse(Start,End,[li]) :-
node(Start,End),append(End,li).
traverse(Start,[li]) :-
node(Start,Z),traverse(Z,append(Start,li).
/*here I would like to check that Z is not a member of li before
I call traverse(Z,I kNow I can check that it is a member
using member(Z,li) but how to I check it is not a member in
prolog*/
findalltraverses(Start,[List]) :-
findall(_,traverse(Start,End).
开始之前:这种语言叫做 prolog。
您的代码有几个不同级别的错误/错误。这是它们的(不完整)列表:
findall
需要一个右括号。findall
需要 3 个参数。第一个位置是您感兴趣的内容,第二个是如何选择数据(哪个调用),第三个是您的答案的容器。您对容器感兴趣,因此 findalltraverses
应将其作为属性。L
与列表统一,则您不必像 [L]
那样声明它,因为对于示例 L=[1,2,3]
[L]
将变为 {{1 }} 是一个列表,其中包含一个包含 [[1,3]]
、1
和 2
的列表。3
有 3 个参数:lists append
、L1
和 L2
,其中 L3
和 {{1} } 附加的是 L1
。L2
有 3 个属性。没有为 2 个属性定义谓词 L3
。traverse/3
并且想要增加它,您需要使用不同的变量来保存结果:traverse/2
。N
附加到列表 N1 is N+1
作为头元素(意思是将它放在第一个位置)可以通过头尾写法来完成:E
。对于 L
和 [E|L]
,E=1
变为 L=[2,3]
。[E|L]
到 [1,3]
的路径感兴趣,您需要以某种方式转发该路径。不可能仅将列表与访问过的节点一起使用,因为在通过递归后退时不会保留此知识。所以你的 Start
谓词应该有 4 个属性。End
表示,意思是“无法证明”。好的,这里截取了一个工作代码。递归结束部分有点不同,因为它不检查从 traverse
到 \+
是否存在边,而是询问 Start
和 End
是否相同。如果是,则结果路径仅包含此节点。这很重要,因为在剪切的代码中,路径将在通过递归(Start
)返回时构建,而包含访问节点的列表在进入时会增长递归 (End
)。
[Start|Path]
让我们测试一下!
[Start|Visited]
看起来不错。
以上是大佬教程为你收集整理的如何在Prolog中获得not效果全部内容,希望文章能够帮你解决如何在Prolog中获得not效果所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。