Я пытался отсортировать список структуры.Prolog Сортировка списка структуры, арифметическая ошибка
Структура как этот
% person(Name, Weight).
person(tom, 65).
person(dan, 70).
person(mike, 80).
И этот список будет как этого
List = [person(tom, 65), person(dan, 70), person(mike, 80)].
Я хочу, чтобы отсортировать список из наибольшего веса как минимум. Как это:
SortList = [person(mike, 80), person(dan, 70), person(tom, 65)].
До сих пор у меня есть это:
sortListPerson([], []).
sortListPerson([person(NameP, WP)|Rest], Result):-
sortListPerson(Rest, List),
insertPerson(person(NameP, WP), List, Result).
insertPerson(person(NameP, WP), [], [person(NameP, WP)]).
insertPerson(person(NameP1, WP1), [person(NameP2, WP2)|Rest], [person(NameP1, WP1)|List]):-
integer(WP1),
integer(WP2),
WP1 @>= WP2,
insertPerson(person(NameP2, WP2), Rest, List).
insertPerson(person(NameP1, WP1), [person(NameP2, WP2)|Rest], [person(NameP2, WP2)|List]):-
integer(WP1),
integer(WP2),
WP1 @< WP2,
insertInPlace(person(NameP1, WP1), Rest, List).
Я пытался со списком из двух людей, и она работает:
?- sortListPerson([person(a, 10), person(b, 30)], SortList).
SortList = [person(b,30),person(a,10)] ? ;
Но когда я пытаюсь с в списке 3 или более человек появляется сообщение об ошибке:
?- sortListPerson([person(a, 10), person(b, 30), person(c, 40)], SortList).
{ERROR: arithmetic:>=/2 - expected an arithmetically evaluable expression, found person(a,10)}
no
?-
Может ли кто-нибудь помочь?
Вы на самом деле не 'лицо (Имя , Вес) .' написано как факт, не так ли? – lurker
Я не вижу '> =/2', используемого в любом месте кода, который вы показываете, но ошибка явно относится к этому оператору. Возможно, в вашем предикате 'insertInPlace/3' есть проблема, которая не отображается. – lurker
@ Danick: Есть ли причина, по которой вы отредактировали тег [tag: clpfd]? Это кажется актуальным для вашего вопроса; http://stackoverflow.com/tags/clpfd/info. – Matt