1

我对 prolog 还很陌生,并且是为家庭作业修改的代码。但是我坚持输入刺痛。我知道在 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). 

将使我能够输入a和b的字符串,但这不起作用,谁能帮助我如何做到这一点?谢谢

4

2 回答 2

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] 
于 2013-09-06T06:34:39.223 回答
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]).

希望有帮助!

于 2013-09-06T05:01:48.313 回答