string - 如何在 Prolog 中连接字符串
问题描述
我正在尝试在 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).
解决方案
您遇到的错误与字符串连接无关。我已经修改了你的find_values
和in_domain
谓词以消除错误。您的in_domain
谓词的问题在于它不会“生成”整数。至于find_values
谓词,需要先把A
、B
、 和C
一些整数统一起来再检查X is A+B*2+C*3
,生成“single”、“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).
推荐阅读
- popupwindow - 如果我们单击 powerbuilder 中的按钮,如何弹出带有一些 I/O 字段的窗口
- python - 我们如何使用公式将工作表添加到 Excel 工作簿?
- java - 如何在 Apache POI 中设置条件格式规则的优先级?
- javascript - 在 HTML 中创建 Ludo 应用程序 || 无法在用户之间切换机会
- java - Spring Boot WebServiceTemplate 编码问题
- c++ - C++ 函数中的无限循环
- javascript - 我需要在滚动上制作动画
- mongodb - 使用相同的 id 将用户信息存储在多个集合中
- javascript - 我正在制作一个使用 firebase 玩纸牌游戏的网站,并且我正在使用实时数据库,但是当有人抽卡时,它会产生无限循环
- javascript - Bootstrap 4 工具提示自我封闭的悖论