gpt4 book ai didi

Prolog - 如何执行 setof 返回空列表而不是失败

转载 作者:行者123 更新时间:2023-12-02 02:35:07 28 4
gpt4 key购买 nike

我需要一个满足目标的有序对象列表。 setof 负责排序,但当没有对象满足目标时会失败。我想像 findall 那样返回一个空列表。

这可行,但是有没有一种方法可以在不削减的情况下实现这一点?我正在使用 SWI-Prolog。

setof(Object, Goal, List), !; List = [].

最佳答案

首先

..., ( setof(Object, Goal, List), ! ; List = [] ), ...

按照您的建议不起作用。 List = [] 总是成功,并且只显示 setof/3 的第一个答案。但是setof/3可能会产生几个答案。适用于任何 Prolog 的通用方法是:

..., ( \+ Goal -> List = [] ; setof(Object, Goal, List) ), ...

许多实现为此提供了特定于实现的控制构造,以避免两次调用Goal。例如。 if/3(SICStus、YAP)或 (*->)/2(SWI、GNU):

..., if( setof(Object, Goal, ListX), ListX = List, List = [] ), ...

..., ( setof(Object, Goal, ListX) *-> ListX = List ; List = [] ), ...

新变量 ListX 对于 List 已实例化的情况(确实罕见)是必需的。

请注意,其他两个答案并不完全符合您的要求。

关于Prolog - 如何执行 setof 返回空列表而不是失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20407430/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com