【问题标题】:Replace atom with variable用变量替换原子
【发布时间】:2016-05-30 20:51:49
【问题描述】:

我有一个术语,它可能包含也可能不包含原子“this”。该术语也可能包含变量。 我需要用变量 I 替换“this”。我该怎么做? 我试图做这样的事情:

term_to_atom((f(a), g(this, b), ...), A),

tokenize_atom(A, L),

replace(this, I, L, L2)

这似乎奏效了。问题是,我需要回到原来的术语,我做不到……

【问题讨论】:

    标签: prolog


    【解决方案1】:

    SWI-Prolog 有 atomic_list_concat/2 和 atom_to_term/2 可以帮助您回到原来的术语。

    main :-
        term_to_atom((f(a), g(this, b)), A),
        tokenize_atom(A, L),
        replace(this, 'I', L, L2),
        atomic_list_concat(L2, A2),
        atom_to_term(A2, T, []),
        writeln(T).
    
    ?- main.
    f(a),g(_G69,b)
    true .
    

    【讨论】:

    • atomic_list_concat 不起作用。我认为这是因为该术语也可能包含变量,而 atomic_list_concat 需要一个原子列表。
    • 您可能想要replace(this, 'I', L, L2),以便您的原子列表包含原子“I”。然后atomic_list_concat 应该可以工作。我已经更新了我的答案以展示一个完整的例子。
    • 它有效,但是当我将术语断言为规则的主体时,它将变量设置为_,我需要它来保留名称。
    【解决方案2】:

    看看这个谓词(替换/4):

    replace(Term,Term,With,With) :-
        !.
    replace(Term,Find,Replacement,Result) :-
        Term =.. [Functor|Args],
        replace_args(Args,Find,Replacement,ReplacedArgs),
        Result =.. [Functor|ReplacedArgs].
    
    replace_args([],_,_,[]).
    replace_args([Arg|Rest],Find,Replacement,[ReplacedArg|ReplacedRest]) :-
        replace(Arg,Find,Replacement,ReplacedArg),
        replace_args(Rest,Find,Replacement,ReplacedRest).
    

    您需要的示例:

    | ?- replace(f(1,23,h(5,this)),this,Var,Result).                                                                                           
    
    Result = f(1,23,h(5,Var))                                                                                                                  
    
    yes
    

    【讨论】:

    • 您也可以使用this one等谓词替换子项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多