在prolog中迭代字母表

时间:2011-03-27 20:49:10

标签: prolog

假设我希望有一些类似于

的比较规则
isin(0,_).
isin(N,List) :- member(N,List), write(N), N1 is N-1, isin(N1,List).

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

提前致谢!

2 个答案:

答案 0 :(得分: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.

(但这真是一个丑陋的黑客。)

答案 1 :(得分: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).

很长一段时间没有用这种语言写任何东西。