我对prolog很新,并且是修改家庭作业的gven代码。然而,我坚持输入叮咬。我知道在prolgo中输入的字符串是ascii代码列表。 即,“abc”= [97,98,99]
这是给定的代码
accept(W) :- start(S), path(S, W).
path(S, []) :- final(S).
path(S, [H|T]) :- arc(S, H, N), path(N, T).
start(1).
final(3).
arc(1, a, 1).
arc(1, b, 2).
arc(2, a, 2).
arc(2, b, 3).
arc(3, a, 3).
这是一个非确定性的机器,知道如何实现字符串,我的假设是将arc()事实更改为
arc(1, 97, 1).
arc(1, 98, 2).
arc(2, 97, 2).
arc(2, 98, 3).
arc(3, 97, 3).
会让我输入一个字母和一个字符串,但是没有用,任何人都可以帮我解决这个问题吗? 谢谢
答案 0 :(得分:0)
Prolog中的数据类型是数字,变量,原子和复合词。从概念上讲,Prolog认为字符串是原子,而不是字符代码列表。请阅读这里(更多)细节:http://en.wikipedia.org/wiki/Prolog#Data_types
此外,如果您想了解更多关于从字符转换为ASCII代码的信息,请阅读以下问题:Prolog - List of CharCodes to a String or Characters
您可以通过为谓词添加列表来测试a和b的列表,以查看它们是否形成路径,例如:
accept([a,a,b,a]).
希望有所帮助!
答案 1 :(得分:0)
您可以将语法保持在更易读的形式,并应用从字符代码到字符的转换:
3 ?- maplist(char_code, W, "aabaabaaa"), accept(W).
W = [a, a, b, a, a, b, a, a, a]
或
9 ?- read_line_to_codes(user_input, Cs), maplist(char_code, W, Cs), accept(W).
|: abab
Cs = [97, 98, 97, 98],
W = [a, b, a, b]
否则,字符文字的语法是
arc(1, 0'a, 1).
arc(1, 0'b, 2).
arc(2, 0'a, 2).
arc(2, 0'b, 3).
arc(3, 0'a, 3).
在更改之后(或使用您的数字表示,arc(1, 97, 1).
)
% /home/carlo/prolog/stackoverflow compiled 0.01 sec, 23 clauses
10 ?- read_line_to_codes(user_input, W), accept(W).
|: abab
W = [97, 98, 97, 98]