【问题标题】:Flatten term Prolog展平术语 Prolog
【发布时间】:2015-04-16 04:29:40
【问题描述】:

我是 Prolog 的新手,我正在尝试解决这样的问题,所以我希望有人能提供帮助。
我想实现一个三元谓词flatten_term(Term, Function_symbol, Flattened_term) 如果 Flattened_term 通过展平所有从 Term 获得,则成功 Function_symbol 的嵌套出现。假设Term 不包含 Prolog 变量和没有列表而不检查列表。

?- flatten_term(f(f(x)), f, Flattened_term).
Flattened_term = f(x).

?- flatten_term(f(x), f, Flattened_term).
 Flattened_term = f(x).

 ?- flatten_term(a, f, Flattened_term).
Flattened_term = a.

?- flatten_term(g(f(x)), f, Flattened_term).
Flattened_term = g(f(x)).

?- flatten_term(g(f(f(x))), f, Flattened_term).
Flattened_term = g(f(x)).

【问题讨论】:

  • 预计您在 stackoverflow.com 上会尝试解决您的问题,并询问您遇到的具体问题,展示您尝试过的内容。此外,您需要考虑并描述问题的条件。有问题的术语是否总是单一的(只有一个参数,如f(f(g(f(a))))?或者他们可能看起来像f(f(b),g(f(f(a)))?如果它们是单一的,您可以使用简单的递归方法来解决您的问题。您可能需要使用term processing predicate
  • 这对初学者来说不是最好的问题,你需要分解函数符号。虽然这是可能的,但我非常怀疑你会从中学到很多东西。此外,尚不清楚f 是什么意思。一个论点?两个论据?任何数字?无论如何,这不是一个好的开始。

标签: prolog


【解决方案1】:

我使用下面的代码来计算一个术语中的项目。也许这与您正在寻找的相似?

?- flatten_term(5+3*x=10,List).
List = [=, +, 5, *, 3, x, 10].

这是源代码:

flatten_term(Term,[Term]):-
    atomic(Term),!.
flatten_term(Term,Flat):-
    Term =.. TermList,
    flatten_term_list(TermList,Flat),!.

flatten_term_list([],[]):-!.
flatten_term_list([H|T],List):-
    flatten_term(H,HList),
    flatten_term_list(T,TList),
    append(HList,TList,List),!.

【讨论】:

    【解决方案2】:

    如前所述,您确实应该展示您的工作示例。但是,这里有一些提示可以帮助您入门:

    1. 扁平化像[a,[b,c],d,[e,[f,g,h]]] 这样的列表只是一个简单的递归树遍历。 Stack Overflow 上有几个问题演示了如何做到这一点,例如,这个问题,How to implement flatten list in prolog ,with tail recursion?

    2. 关于类型检查和术语的分析、构造和分解有许多谓词:

    3. 特别是,可以使用 univ 运算符 =../2:

      将复合术语分解为列表
      foo(alpha,bravo,charlie) =.. L
      

      产生L = [foo,alpha,bravo,charlie]

      还应注意,'=../2` 用于将列表转换为复合词:

      T =.. [foo,alpha,bravo,charlie]
      

      正如人们所期望的那样,T = foo(alpha,bravo,charlie).

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 2011-10-14
      相关资源
      最近更新 更多