Prolog - 为列表的每个元素添加一个特殊字符

Prolog - Add a special character to every element of a list

我正在尝试向列表的每个元素添加一个特殊字符 (*)。

我想在元素的开头和结尾添加它,所以如果我有:

list(apple,orange,pear)

它将是:

list(*apple*,*orange*,*pear*)

有没有办法在序言中做到这一点?

谢谢。

要连接两个原子,您可以使用 ISO 谓词 atom_concat/3:

?- atom_concat('*', apple, StarAtom), atom_concat(StarAtom, '*', StarAtomStar).
StarAtom = '*apple',
StarAtomStar = '*apple*'.

使用此谓词,您可以定义以下新谓词:

% starry_atom(+Atom, -StarAtomStar)

  starry_atom(Atom, StarAtomStar) :-
      atom_concat('*', Atom, StarAtom),
      atom_concat(StarAtom, '*', StarAtomStar).

示例:

?- starry_atom(apple, StarryAtom).
StarryAtom = '*apple*'.

要将starry_atom/2应用于列表的所有元素,假设列表的所有元素都是原子,您可以使用谓词maplist/3.

?- maplist(starry_atom, [apple, orange, pear], List).
List = ['*apple*', '*orange*', '*pear*'].

注意 在 SWI-Prolog 中,您还可以使用谓词 atomic_list_concat/2.

?- atomic_list_concat(['*', apple, '*'], Atom).
Atom = '*apple*'.