2014-10-12 45 views
1

我必须编写一个谓词,它将交换两个或两个以上长度的原子中的前两个字母。一个原子的长度不变。谓语将交换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] ; 

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

+0

你可以用'名字/ 2'也为转换的字符列表到原子。所以,试试这个:'名称(凌动,[111,102 |“OD”])' – findall 2014-10-12 09:18:39

+0

一个问题,你没有提到,就是你很可能得到“单变量”的警告,这意味着你有AREN变量” t在你的逻辑中被实例化。你应该检查那些警告。其中至少有一个是答案中“_VCSF”(一个没有实际意义的变量)的原因。另外,从逻辑上考虑你的规则。例如,规则“inter(X,[])。”表示对于* any * atom,'X',有效答案是'[]'。这合乎逻辑吗? – lurker 2014-10-12 10:09:47

+1

@findall谓词'name/2'应该被认为是遗留的,不推荐使用。现在,最好使用标准的'atom_codes/2'或'atom_chars/2'内置谓词。 – 2014-10-12 10:44:03

回答

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 
    ). 
+0

我的教授要求我们使用name ..你可以告诉我如何使用name来实现上面的内容。 – abc 2014-10-12 20:20:15

+1

看到我上面的评论:'name/2'是一个陈旧的,不赞成的谓词。也就是说,你可以简单地用'name'替换我的答案'atom_chars'。但是如果你这样做了,你还应该将'Char *'变量重命名为'Code *'以保持一致性。 – 2014-10-12 20:30:12

+0

'name/2'会给你奇怪的结果。像'swap_(1.2,'。12')'而不是干净的错误。 – false 2014-10-14 18:01:54