ML-KULeuven / problog

ProbLog is a Probabilistic Logic Programming Language for logic programs with probabilities.

Home Page:https://dtai.cs.kuleuven.be/problog/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

bug in String library: str2lst?

Mezzenilium opened this issue · comments

I try to use the predicates of the String library of Problog2, but it does not work or I have not understood the way to properly use them :
%:- use_module(library(lists)).
:- use_module(library(string)).

  o1(L) :- L = str2lst("aaaa, zzzz, eeee, rrrr").
  o2(S) :- S = lst2str(["aaa","dddd","fffff"]).
  o3(T) :- T = join('',["aaa","dddd","fffff"]).
  
  query(o1(S)).
  query(o2(S)).
  query(o3(S)).

gives

  o1(str2lst("aaaa, zzzz, eeee, rrrr")):	1         
  o2(lst2str(["aaa", "dddd", "fffff"])):	1         
  o3(join('',["aaa", "dddd", "fffff"])):	1

Originally posted by @Mezzenilium in #79 (comment)

I have made some progress in the use of the string library. I manage to have lst2str, join and concat working. But str2lst (test1) gives "An unexpected error has occurred." .

:- use_module(library(string)).
 
  atome1('aaaa zzzz eeee rrrr').
  test1(L) :- atome1(A), str2lst(A, L).
  
  atome2(['aaa','dddd','fffff']).
  test2(L) :- atome2(A), lst2str(A, L). 
  
  sep(',').
  atome3(['aaa','dddd','fffff']).
  test3(L) :- sep(S),atome3(A), join(S, A, L). 
  
  atome4(['aaa','dddd','fffff']).
  test4(L) :- atome3(A), concat(A, L). 
  
  %query(test1(V)).
  query(test2(U)).
  query(test3(T)).
  query(test4(X)).

That might be a bug... @rmanhaeve What do you think?

:- use_module(library(string)).

test1(L) :- str2lst('aaaa zzzz eeee rrrr', L).
test2(L) :- lst2str(['aaa','dddd','fffff'], L).
test3(L) :- join(',', ['aaa','dddd','fffff'], L).
test4(L) :- concat(['aaa','dddd','fffff'], L).
  
query(test1(_)).
%query(test2(_)).
%query(test3(_)).
%query(test4(_)).

yields

  File ".../problog/problog/extern.py", line 110, in _convert_output
    return list2term(a)
  File ".../problog/problog/logic.py", line 119, in list2term
    for e in reversed(lst):
TypeError: 'map' object is not reversible

An unexpected error has occurred.

The current definition of str2lst (from string.py)

@problog_export("+str", "-list")
def str2lst(string):
    return map(Term, map(make_safe, string))

should probably be

@problog_export("+str", "-list")
def str2lst(string):
    return list(map(Term, map(make_safe, string)))

(notice return function), because right now it returns a map-function rather than a list. And since it expects to get a list ("-list"), it tries to convert the python list into a prolog list (here) which crashes because it instead received a map-function that is not reversible.

I have modified the string.py file with the statement return list(map(Term, map(make_safe, string))).
My test examples run smoothly now and str2lst transforms a string in a list of its characters.

Thank you for your support.