Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog为什么这个查询返回这个特定的结果,它的效果是什么_Prolog - Fatal编程技术网

Prolog为什么这个查询返回这个特定的结果,它的效果是什么

Prolog为什么这个查询返回这个特定的结果,它的效果是什么,prolog,Prolog,这个查询的效果是什么?为什么它会返回这个特定的结果?产生yes结果的原因是R,即仅由a和b组成的集合实际上是满足p(x)谓词的所有x的集合 如果要向R添加元素或从R中删除a或b,结果将是no p(a)和p(b)为true,因为断言谓词将这些子句添加到数据库中 类似地,保持R=[a,b]如果您要添加另一个子句,使用sayassert(p(c)),结果将是no(因为R将缺少c以拥有满足p(X)的所有X)。注意X在调用setof/3后保持未绑定状态,因为X是一个“虚拟变量”用于告诉Prolog在列表R

这个查询的效果是什么?为什么它会返回这个特定的结果?

产生
yes
结果的原因是R,即仅由a和b组成的集合实际上是满足p(x)谓词的所有x的集合

如果要向R添加元素或从R中删除a或b,结果将是
no

p(a)和p(b)为true,因为断言谓词将这些子句添加到数据库中


类似地,保持
R=[a,b]
如果您要添加另一个子句,使用say
assert(p(c))
,结果将是
no
(因为R将缺少c以拥有满足p(X)的所有X)。

注意
X
在调用
setof/3
后保持未绑定状态,因为
X
是一个“虚拟变量”用于告诉Prolog在列表
R
中要收集的目标
p(X)
的解决方案
setof/3
还允许在目标中出现多个变量时使用更复杂的语法,因此一些变量的值可以作为复合术语组合在列表中,而其他变量的值可以在回溯中绑定或修改。
?- assert(p(a)),assert(p(b)),setof(X,p(X),R).
X = H142
R = [a, b] 
yes