2011-03-27 65 views
0

字母比方说,我希望有类似的比较,一些规则迭代通过在序言

isin(0,_). 
isin(N,List) :- member(N,List), write(N), N1 is N-1, isin(N1,List). 

但列表将包含字母符号(例如,[A,B,d,E,H])。我如何将下一个元素发送到迭代? (所以N是一个符号,而不是数字)。如果这是不可能的,我怎么能做出类似的东西?

提前致谢!

回答

3

@julkiewicz几乎有:

isin(a, _). 
isin(Char, List) :- 
    member(Char, List), 
    char_code(Char, Code), 
    write(Char), 
    Code1 is Code-1, 
    char_code(Char1, Code1), 
    isin(Char1, List). 

注意,谓词将始终a成功,就像原来的版本总是会成功的0。您可以防止通过改变基础子句类似

isin(Char, _) :- 
    char_code(a, A), 
    Char is A-1. 

(不过这确实是一个丑陋的黑客攻击。)

+0

谢谢!它工作完美! (但显然它并没有解决我的问题xD) – Kirby 2011-03-27 21:34:24

+0

@Kirby:我很怀疑,因为我不明白你的代码在第一个地方......也许你可以发表一个新的问题,描述你想要的问题解决? – 2011-03-27 21:40:44

2

注意:这适用于字符串,而不适用于OP所要求的符号。

那么好像字符真的被解释为数字列表。所以这个工程:

?- X = "a". 
X = [97]. 
?- X is "a". 
X = 97. 
?- X is "a" + 1. 
X = 98. 

原来这就是我提出:

isin("a", _). 
isin(N, List) :- member(N, List), N1 is N - 1, isin([N1], List). 

有没有这种语言很长一段时间写的东西虽然。

+0

除了在字符串'write'(成炭代码列表)'“一” '打印'[97]'。 – 2011-03-27 21:09:09

+0

是的,没错。他们是列表号码,但'是'自动解包它们。 – julkiewicz 2011-03-27 21:14:36

+0

问题是,a是一个符号,而不是一个字符串(它们在图顶点,如图(a,b)。) – Kirby 2011-03-27 21:15:17