Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/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 序言:从X=X的事实返回Y的列表_Prolog - Fatal编程技术网

Prolog 序言:从X=X的事实返回Y的列表

Prolog 序言:从X=X的事实返回Y的列表,prolog,Prolog,我对Prolog还不太熟悉,不能对某个问题绞尽脑汁。 假设我有两个事实(X,Y): 事实(a,m)。 事实(b,m)。 事实(c,n)。 事实(x,q)。 事实(x,y)。 事实(x,z) 我想用一个特定的X创建一个所有Y事实的列表。 例如: ?-getList(x,LIST)。 列表=[q,y,z] q、 返回y,z是因为它们是在X=X的事实中找到的 有没有快速的方法可以做到这一点?我曾尝试使用递归迭代所有事实(x,Y)并附加每个Y,但我无法使其工作 提前谢谢你 您应该使用来获取查询的所有解决

我对Prolog还不太熟悉,不能对某个问题绞尽脑汁。 假设我有两个事实(X,Y):
事实(a,m)。
事实(b,m)。
事实(c,n)。
事实(x,q)。
事实(x,y)。
事实(x,z)

我想用一个特定的X创建一个所有Y事实的列表。 例如:
?-getList(x,LIST)。
列表=[q,y,z]

q、 返回y,z是因为它们是在X=X的事实中找到的

有没有快速的方法可以做到这一点?我曾尝试使用递归迭代所有事实(x,Y)并附加每个Y,但我无法使其工作

提前谢谢你

您应该使用来获取查询的所有解决方案,并收集一个包含所需模板的列表

在您的示例中,它应该是:

findall(Y, fact(x, Y), LIST).

事实上,如果没有解决方案,使用setof/3或bagof/3会正确地失败,而findall会执行“程序性操作”,并成功地处理空列表。@DavidTonhofer:事实上,我相信学生可以更容易地理解findall/3,然后如果需要,继续使用setof/3或bagof/3。我还认为,如果没有找到解决方案,他想要的是一张空名单,而不是失败。你们真是太棒了,谢谢!真不敢相信我自己没找到这个。