如何在Prolog中连接字符串

时间:2019-05-16 13:22:29

标签: 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).

1 个答案:

答案 0 :(得分:0)

与字符串连接无关的错误。我已经修改了您的find_valuesin_domain谓词以消除该错误。您的in_domain谓词的问题在于它不会“生成”整数。对于find_values谓词,您需要先将ABC与一些整数统一起来,然后再检查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).