我必须编写一个谓词,它将交换两个或两个以上长度的原子中的前两个字母。一个原子的长度不变。谓语将交换Prolog中原子中的前两个字母
?- 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] ;
如何改进我的代码以获得所需的输出。提前致谢。
你可以用'名字/ 2'也为转换的字符列表到原子。所以,试试这个:'名称(凌动,[111,102 |“OD”])' – findall 2014-10-12 09:18:39
一个问题,你没有提到,就是你很可能得到“单变量”的警告,这意味着你有AREN变量” t在你的逻辑中被实例化。你应该检查那些警告。其中至少有一个是答案中“_VCSF”(一个没有实际意义的变量)的原因。另外,从逻辑上考虑你的规则。例如,规则“inter(X,[])。”表示对于* any * atom,'X',有效答案是'[]'。这合乎逻辑吗? – lurker 2014-10-12 10:09:47
@findall谓词'name/2'应该被认为是遗留的,不推荐使用。现在,最好使用标准的'atom_codes/2'或'atom_chars/2'内置谓词。 – 2014-10-12 10:44:03