【问题标题】:SWI prolog make set of variables name with rbtrees or others meansSWI prolog 使用 rbtrees 或其他方式生成变量名称集
【发布时间】:2014-01-25 00:09:10
【问题描述】:

我有一个术语,我想从中获取一组变量名称。

例如。输入:my_m(aa,b,B,C,max(D,C),D) 输出:[B,C,D](无需按照输入中出现的顺序排序) (这会调用 set_variable_name(Input,Output)。)

我可以简单地从输入中获取 [B,C,D,C,D],但不知道如何实现 set(仅在输出中出现一次)。我尝试过像存储在 rbtrees 中但失败了,因为

only_one([],T,T) :- !.
only_one([X|XS],B,C) :- rb_in(X,X,B), !, only_one(XS,B,C).
only_one([X|XS],B,C) :- rb_insert(B,X,X,U), only_one(XS,U,C).

它返回只有一个节点和统一的树,如B=C, C=D...。我想我明白了 - 因为在质疑 rb_in(..) 时统一了 X。

那么,如何只存储一次该变量名?还是因为我们使用的是逻辑编程,所以这个想法根本上是错误的?如果你想知道我为什么需要这个,那是因为我们被要求在 Prolog 中实现 A* 算法,这是制作搜索空间的一部分。

【问题讨论】:

    标签: variables tree prolog set


    【解决方案1】:

    您可以使用sort/2,它也会删除重复项。

    【讨论】:

    • 但我想存储变量的名称。你是这么想的吗? c([],[]) :- !. c([X|XS],C) :- c(XS,A), append(X,A,D), sort(D,C). 试试 c([A,B,C,A],R)。 ?我想得到 R=[A,B,C]。
    • 内置谓词sort/2 可以做到这一点。试试?- sort([A,B,C,A], Vs).
    • 您有我的感谢和抱歉!有用。我想尝试一些 add if not in ,因为这样有可能多次追加然后排序。还有其他方法吗?
    • 使用变量时,必须注意不要意外地统一它们。要检查变量是否相等,请使用==/2append/3 不会。我建议您简单地使用sort/2 或预先检查变量是否已经在列表中,例如使用==/2,以查看变量 X 是否在列表中Vs ,试试member(V, Vs), V == X.。请注意,X 与列表中的每个元素在回溯时是统一的,如果您简单地使用 member(X, Vs)
    • 是的,正因为如此。但是为什么不实现已经存在的东西term_variables/2 :))
    猜你喜欢
    • 1970-01-01
    • 2012-03-10
    • 2014-10-03
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    相关资源
    最近更新 更多