我试图在Prolog中进行与IO相关的练习,但发现使用字符串很难。
任务是获取一个输入(整数1 <= n <= 180),并写入三个项k * d的总和,其中k = 1,2或3且1 <= d <= 20
例如:
输入:180
输出:三重20,三重20,三重20
输入:96
输出:三重19,双15,单9
我的问题是我收到错误消息:
“ [[我尝试过的某些谓词]:参数不足 实例化”。
我尝试的最后一件事是在StackOverflow Concatenation of Strings in Prolog的另一个线程上发现的连接谓词。我认为它看起来不错,但我仍然有同样的问题。请参阅下面的代码。
在我改用string_concat/3之前。
main :-
repeat,
read(X),
(
X == end_of_file
;
integer(X),
dart_scores(X,N),
write(N),
fail
).
dart_scores(X,N) :-
concatenate([A1,B1,C1],N),
concatenate(["single", A], A1),
concatenate(["double", B], B1),
concatenate(["triple", C], C1),
find_values(X,A,B,C).
find_values(X,A,B,C) :-
X is A+B*2+C*3,
in_domain(A),
in_domain(B),
in_domain(C).
in_domain(D) :-
integer(D),
D>=1,
20>=D.
concatenate(StringList, StringResult) :-
maplist(atom_chars, StringList, Lists),
append(Lists, List),
atom_chars(StringResult, List).
答案 0 :(得分:0)
与字符串连接无关的错误。我已经修改了您的find_values
和in_domain
谓词以消除该错误。您的in_domain
谓词的问题在于它不会“生成”整数。对于find_values
谓词,您需要先将A
,B
和C
与一些整数统一起来,然后再检查X is A+B*2+C*3
,并为“单”,“ double”和“ triple”。希望这会对您有所帮助!
main :-
repeat,
read(X),
(
X == end_of_file
;
integer(X),
dart_scores(X,N),
write(N) /*,
fail */
).
dart_scores(R,N) :-
find_values(R,A,B,C,X,Y,Z),
mult(X, A1),
mult(Y, B1),
mult(Z, C1),
concatenate([A1,A], A2),
concatenate([B1,B], B2),
concatenate([C1,C], C2),
concatenate([A2,B2,C2],N).
mult(1, "single").
mult(2, "double").
mult(3, "triple").
find_values(R,A,B,C,X,Y,Z) :-
in_domain(A),
in_domain(B),
in_domain(C),
range(X,1,3),
range(Y,1,3),
range(Z,1,3),
R is A*X+B*Y+C*Z.
in_domain(D) :-
range(D, 1, 20).
range(Low, Low, _).
range(Out, Low, High) :- NewLow is Low+1, NewLow =< High, range(Out, NewLow, High).
concatenate(StringList, StringResult) :-
maplist(atom_chars, StringList, Lists),
append(Lists, List),
atom_chars(StringResult, List).