Prolog定义中的输入/输出参数有什么区别吗?这与其他语言如scheme和C相比如何?
答案 0 :(得分:2)
我希望我理解你的问题。你应该研究如何在Prolog中实现统一,因为它会使事情更加清晰。无论如何:
简而言之,没有内置方法可以将Prolog谓词的参数声明为输入,输出或输入/输出。
在C中,你可以说:
void foo(int const *a, int *b)
{
*b += *a;
}
你可以说,在foo
的上下文中,a
是输入参数,而b
是输出参数。在Prolog中,您可以在描述谓词时使用this notation,但是在谓词定义的头部声明无法绑定参数必须或调用谓词时的自由变量。无论如何,纯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的非常有限的经验中,我注意到只要有足够的参数被实例化到以下任何一个,就会尝试定义有效的谓词:
例如,length(List, Integer)
可以告诉您列表的长度,列出给定长度的未实例化变量,或检查列表是否长。
然而,您可以做的是在谓词定义的开头有一个基础术语,例如foo(1)
。这种谓词称为事实。头部中带有基础术语的子句是定义递归谓词的递归结束的常用方法。
答案 1 :(得分:0)
Prolog定义中的输入/输出参数有什么区别吗?
不,实际上参数可以是一个,具体取决于它的使用方式。鲍里斯的长度例子很好,因为你可以计算长度:
?- length([1,2,3], X).
X = 3.
或测试答案:
?- length([1,2,3], 3).
true.
或生成指定长度的列表:
?- length(X, 3).
X = [_G273, _G276, _G279].
甚至可以生成列表和长度:
?- length(X, Y).
X = [],
Y = 0 ;
X = [_G15],
Y = 1 ;
X = [_G15, _G18],
Y = 2 ;
...
所以你看到length/2
的任何一个参数都可以被实例化,你仍然会得到有意义的答案。并非Prolog中的每个谓词都是灵活的,但很多都是。
这与其他语言如scheme和C相比如何?
这是Prolog与其他语言之间的主要差异。没有其他更为人所知的语言可以帮助你理解它。这意味着,除了其他差异之外,没有隐含的“返回值”,您必须有一个参数来传回结果,但您不仅限于一个结果参数。在length/2
的两个参数都未实例化的情况下,它们都作为返回值。
按照惯例,您需要编写谓词,以便输入参数在常见案例的输出参数之前(或者至少以您选择的名称的合理方式)。