我希望我理解你的问题。您应该研究一下 Prolog 中如何实现统一,因为它会让事情变得更清晰。反正:
简而言之,没有内置方法可以将 Prolog 谓词的参数声明为输入、输出或输入/输出。
在 C 语言中,你可以说:
void foo(int const *a, int *b)
{
*b += *a;
}
你可能会争辩说,在这样的背景下foo
, a
是一个输入参数,而b
是一个输出参数。在 Prolog 中,您可以使用这个符号 http://www.swi-prolog.org/pldoc/doc_for?object=section%282,%274.1%27,swi%28%27/doc/Manual/preddesc.html%27%29%29描述谓词时,但没有办法declare在谓词定义的头部,一个参数must调用谓词时可以是绑定变量或自由变量。无论如何,纯 Prolog 中的大多数谓词都具有可以是的参数input, output, or 输入输出,取决于谓词的使用方式。看在SWI-Prolog的列表库中 http://www.swi-prolog.org/pldoc/doc_for?object=section%282,%27A.12%27,swi%28%27/doc/Manual/lists.html%27%29%29对于很多例子。
您当然可以要求实例化参数或自由变量,但这是在谓词定义的主体中完成的:
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 是否成立,而不是将 2 添加到 A 并将结果与 B 统一。integer/1
, var/1
,以及验证术语类型的其他谓词 http://www.swi-prolog.org/pldoc/doc_for?object=section%282,%274.6%27,swi%28%27/doc/Manual/typetest.html%27%29%29无法在纯 Prolog 中实现。
根据我对 Prolog 的非常有限的经验,我注意到人们会尝试定义只要有足够的参数实例化为以下任一者就可以工作的谓词:
- 根据谓词的逻辑实例化其他变量
- 推断谓词描述的参数之间的关系是否成立。
例如,length(List, Integer)
可以告诉您列表有多长,创建给定长度的未实例化变量的列表,或者检查列表是否那么长。
但是,您可以做的是在谓词定义的开头添加一个基本术语,例如foo(1)
。这种谓词称为facts。头部带有基本术语的子句是定义递归谓词递归结束的常用方法。