prolog - Prolog 中按值结果传递如何工作的示例
问题描述
我是 Prolog 的新手,我知道按值结果传递是如何工作的。但是,我注意到 Prolog 缺乏学习材料,并希望看到它在该语言中如何工作的示例。
解决方案
答案是:没有。
在标准术语中,您始终且仅“通过引用传递”。您通过引用传递的对象是术语(这些是有向的,可能是循环图,通常是树),它们是全局可见的(可能是字符串、原子、数字等的模优化)。
因此,当您调用此目标时:
?- member(X,[1,2,3]).
谓词member/2
接收对全局存储区域中“空单元”的引用,上面由变量名称命名X
(它会尝试用有用的东西填充它),以及对结构的引用,这里[1,2,3]
可能写在全局储藏区域。
返回时,打印X
由 填充的的值:member/2
?- member(X,[1,2,3]).
X = 1 ;
...
至于返回值,用标准术语来说,一个被调用的谓词(由一个原子目标p(X,Y)
表示,如或 false(表示“谓词证明失败”/“没有证明该目标的证据”/“没有理由在逻辑上将此目标标记为 TRUE”)。或者,它可以抛出异常。
请注意,Prolog 中没有办法表达“目标可以在逻辑上标记为 FALSE”(即使 Prolog 可能会傲慢地打印false
以响应查询),尽管存在“否定为失败”,但这是另一个问题。
推荐阅读
- c# - Entity Framework Core 添加具有已保存依赖项的实体会引发错误
- java - 传递 Context 或使用 view.getContext()。真的有关系吗?
- macos - 编辑 /etc/paths 后,打印机在重新启动后不再被 macOS 识别
- ansible - Ansible 和寄存器值
- sql - 在 PostgreSQL 中按组内的元素过滤
- python - 我的带有滚动条的 tkinter 窗口滞后
- typescript - 如何避免强制转换实例类类型?
- java - 如何使 com.fasterxml.jackson 垂直打印数组?
- c++ - 我遇到了不转换 const__gnu_cxx::__normal_iterator 的问题
- youtube - 获取之前上传和预定的 youtube 视频的预定发布日期/时间