prolog - 序言中输入/输出参数之间的区别

标签 prolog parameter-passing

Prolog 谓词定义中的输入和输出参数有什么区别吗?这与 Scheme 和 C 等其他语言相比如何?

最佳答案

希望我理解您的问题。您应该研究统一是如何在 Prolog 中实现的,因为它会让事情变得更清楚。无论如何:

简而言之,没有内置方法可以将 Prolog 谓词的参数声明为输入、输出或输入/输出。

在 C 中,你可以说:

void foo(int const *a, int *b)
{
    *b += *a;
}

foo 的背景下,您可能会争辩说, a是一个输入参数,而 b是一个输出参数。在 Prolog 中,您可以使用 this notation在描述谓词时,但是没有办法在谓词定义的头部声明当谓词被调用时参数必须被绑定(bind)或自由变量。无论如何,纯 Prolog 中的大多数谓词都有可以是输入输出输入/输出 的参数,具体取决于谓词的使用方式。看at the list library of SWI-Prolog有很多例子。

您当然可以要求实例化参数或自由变量,但这是在谓词定义的主体中完成的:

add_2(A, B) :- integer(A), var(B), B is A+2.

比较一下:

plus_2(A, B) :- integer(A), integer(B), B =:= A+2.

检查 B=A+2 是否成立,而不是将 A 加 2 并将结果与​​ B 统一。integer/1 , var/1 , 和 other predicates that verify the type of a term不能在纯 Prolog 中实现。

在我对 Prolog 非常有限的经验中,我注意到有人会尝试定义只要有足够的参数被实例化就可以工作的谓词:

  1. 根据谓词逻辑实例化其他变量
  2. 推断谓词描述的参数之间的关系是否成立。

例如,length(List, Integer)可以告诉你一个列表有多长,列出给定长度的未实例化变量,或者检查列表是否有那么长。

然而,您可以做的是在谓词定义的头部有一个基础术语,例如 foo(1) .这种谓词称为事实。头部带有基础项的子句是定义递归谓词的递归结束的常用方法。

关于prolog - 序言中输入/输出参数之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16008754/

相关文章:

Prolog HTTP动态添加html链接

prolog - 将文本保存在列表或其他中

compiler-errors - 反转Prolog中的列表时出现运行时错误

c# - 仅使用一个元素传递 IEnumerable 与传递元素本身的成本

actionscript-3 - AS3将变量参数传递给通用功能菜单/子项

java - Java 是 "pass-by-reference"还是 "pass-by-value"?

序言 - 为什么我应该使用 'dif' 而不是 '=\='

prolog - 将 findall 与 arg 一起使用

c# - 将文件上传控件作为参数传递给方法

c++ - 为什么将 set::iterator 而不是 const_iterator 传递给函数会违反单一定义规则?