首页 > 解决方案 > 如何在 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).

标签: stringprolog

解决方案


您遇到的错误与字符串连接无关。我已经修改了你的find_valuesin_domain谓词以消除错误。您的in_domain谓词的问题在于它不会“生成”整数。至于find_values谓词,需要先把AB、 和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).

推荐阅读