【问题标题】:How to concatenate strings in Prolog如何在 Prolog 中连接字符串
【发布时间】:2019-05-20 03:07:44
【问题描述】:

我正在尝试在 Prolog 中进行与 IO 相关的练习,但发现使用字符串很困难。

任务是接受一个输入(整数 1

例如:

输入: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).

【问题讨论】:

    标签: string prolog


    【解决方案1】:

    您遇到的错误与字符串连接无关。我已经修改了您的 find_valuesin_domain 谓词以消除错误。 in_domain 谓词的问题在于它不会“生成”整数。至于find_values谓词,需要先将ABC与一些整数统一起来,再检查X is A+B*2+C*3,生成“单”、“双”、“三”的整数.希望对您有所帮助!

    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).
    

    【讨论】:

    • 非常感谢,帮了大忙!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2012-09-24
    • 2011-09-11
    • 2014-07-24
    • 2016-11-07
    相关资源
    最近更新 更多