【发布时间】: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/2或atom_chars/2内置谓词。 -
@PauloMoura 谢谢你给我很好的信息。
标签: prolog