【问题标题】:Predicate that will swap the first two letters in an atom in Prolog谓词将交换 Prolog 中原子中的前两个字母
【发布时间】:2014-10-12 09:05:04
【问题描述】:

我必须编写一个谓词,它将交换长度为 2 或以上的原子中的前两个字母。长度一原子不变。

?- interchange(cat,X). 
X = act;

我想使用名称函数来拆分原子:

?- name(food,[X,Y|Z]).

Z = "od",
Y = 111,
X = 102 ;

这是我写的代码:

inter(X,[]).

inter(X,[Q|W]):-
    name(X,[H,T|R]), reverse([H,T],W), !, append([W],[R],F).

我得到这个输出:

P = [] ;

P = [_VCSF, 111, 102] ;

如何改进我的代码以获得所需的输出。提前致谢。

【问题讨论】:

  • 您也可以使用name/2 将字符列表转换为原子。所以试试这个:name(Atom, [111, 102 | "od"])
  • 您没有提到的一个问题是,您可能会收到“单例变量”警告,这意味着您有未在逻辑中实例化的变量。您应该检查这些警告。至少其中一个是答案中_VCSF(一个未实例化的变量)的原因。另外,从逻辑上考虑你的规则。例如,规则 inter(X, []). 表示对于 any 原子 X,有效答案是 []。这合乎逻辑吗?
  • @findall 谓词name/2 应被视为遗留,已弃用。现在,最好使用标准的atom_codes/2atom_chars/2 内置谓词。
  • @PauloMoura 谢谢你给我很好的信息。

标签: prolog


【解决方案1】:

使用标准的atom_chars/2 内置谓词:

swap_first_two_characters(Atom, SwappedAtom) :-
    (   atom_chars(Atom, [Char1, Char2| Chars]) ->
        % two or more chars
        atom_chars(SwappedAtom, [Char2, Char1| Chars])
    ;   % one char atom
        SwappedAtom = Atom
    ).

【讨论】:

  • 我的教授要求我们使用名称..你能告诉我如何使用名称来实现上述内容。
  • 查看我上面的评论:name/2 是一个旧的、已弃用的谓词。也就是说,您可以简单地将我的答案atom_chars 替换为name。但如果你这样做,你还应该将Char* 变量重命名为Code* 以保持一致性。
  • name/2 会给你奇怪的结果。像 swap_(1.2,'.12') 而不是一个干净的错误。
猜你喜欢
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多