假设我希望有一些类似于
的比较规则isin(0,_).
isin(N,List) :- member(N,List), write(N), N1 is N-1, isin(N1,List).
但列表将包含字母符号(例如[a,b,d,e,h])。如何将下一个元素发送到迭代? (所以N是符号,而不是数字)。如果不可能,我怎么能做类似的东西?
提前致谢!
答案 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).
很长一段时间没有用这种语言写任何东西。