如何按prolog中字符串的一部分对字符串列表进行排序

时间:2018-03-11 19:30:34

标签: sorting prolog

如果我有一个包含123.1234,abc321.321,qwe的列表,我如何只按浮点值对列表进行排序?

我尝试使用sort/4,但它不起作用。是否可以使用其他类似键盘?

?- sort(["10.29127443524318,F","5.968607804131937,A"],LL).
LL = ["10.29127443524318,F", "5.968607804131937,A"].

当我做上述排序时,它给了我错误的答案。

1 个答案:

答案 0 :(得分:0)

排序是整数和浮点数的数字,字符串是字符串(因此在您的示例中排序是正确的,因为" 1"按字母顺序排列" 5")。

您可以将字符串转换为数字,但如果字符串中存在非数字部分(例如示例中为,F),则会导致错误。

因此,您需要先拆分字符串,然后对生成的子字符串列表进行排序。对于列表列表,在内部列表的第一个元素上执行排序,然后在第一个元素相等的情况下执行第二个元素,等等。

排序后,子串可以再次连接。这里可以在串联期间隐式执行从数字到字符串的转换。

分裂,数字转换和重组可以用Prolog基本的递归方式完成。

MWE:

sort_compound(L1,LL) :-
    split_compound(L1,L2),
    sort(L2,L3),
    recombine(L3,LL).

split_compound([H|T],[[N,L2]|T2]) :-
    split_string(H,",","",[H1,L2]),
    number_string(N,H1),
    split_compound(T,T2).

split_compound([],[]).

recombine([[A,B]|T],[C|T2]) :-
    atomics_to_string([A,',',B],C),
    recombine(T,T2).

recombine([],[]).

结果:

?- sort_compound(["10.29127443524318,F","5.968607804131937,A"],LL).
LL = ["5.968607804131937,A", "10.29127443524318,F"].

请注意,有几个SWI-Prolog特定谓词用于数据类型转换,因此对于其他解释器,这需要进行调整。