Проблема при попытке запустить (очевидно) простой предикат в Прологе - PullRequest
0 голосов
/ 30 ноября 2011

Я реализовал следующие предикаты в прологе:

roulette_wheel(EvaluatedPopulation, Result) :-
    get_total_fitness(EvaluatedPopulation, Total_fitness),
    random(0, Total_fitness, Target),
    roulette_wheel_iteration(EvaluatedPopulation, 0, Target, Result).

roulette_wheel_iteration([[Fitness,Individual]|Tail], Counter, Target, Result) :-
    CounterX is Counter + Fitness,
    (CounterX >= Target) -> (Result = Individual); roulette_wheel_iteration(Tail, CounterX, Target, Result).

При попытке запустить их с треском происходит сбой с

| ?- roulette_wheel([[10,[1,1,1]], [20, [2,2,2]], [50, [5,5,5]]], R).
! Instantiation error in argument 2 of is/2
! goal:  _114 is _117+20

Вот журнал трассировки:

| ?- roulette_wheel([[10,[1,1,1]], [20, [2,2,2]], [50, [5,5,5]]], R).
        1      1 Call: roulette_wheel([[10,[1,1,1]],[20,[2,2,2]],[50,[5,5,5]]],_597) ? 
        2      2 Call: get_total_fitness([[10,[1,1,1]],[20,[2,2,2]],[50,[5,5,5]]],_1183) ? 
        3      3 Call: get_total_fitness([[20,[2,2,2]],[50,[5,5,5]]],_1691) ? 
        4      4 Call: get_total_fitness([[50,[5,5,5]]],_2191) ? 
        5      5 Call: get_total_fitness([],_2691) ? 
        5      5 Exit: get_total_fitness([],0) ? 
        6      5 Call: _2191 is 50+0 ? 
        6      5 Exit: 50 is 50+0 ? 
        4      4 Exit: get_total_fitness([[50,[5,5,5]]],50) ? 
        7      4 Call: _1691 is 20+50 ? 
        7      4 Exit: 70 is 20+50 ? 
        3      3 Exit: get_total_fitness([[20,[2,2,2]],[50,[5,5,5]]],70) ? 
        8      3 Call: _1183 is 10+70 ? 
        8      3 Exit: 80 is 10+70 ? 
        2      2 Exit: get_total_fitness([[10,[1,1,1]],[20,[2,2,2]],[50,[5,5,5]]],80) ? 
        9      2 Call: random(0,80,_1190) ? 
        9      2 Exit: random(0,80,12) ? 
       10      2 Call: roulette_wheel_iteration([[10,[1,1,1]],[20,[2,2,2]],[50,[5,5,5]]],0,12,_597) ? 
       11      3 Call: _9340 is 0+10 ? 
       11      3 Call: _9340 is 0+10 ? 
       11      3 Exit: 10 is 0+10 ? 
       12      3 Call: 10>=12 ? 
       12      3 Fail: 10>=12 ? 
       13      3 Call: roulette_wheel_iteration([[20,[2,2,2]],[50,[5,5,5]]],_9340,12,_597) ? 
       14      4 Call: _9897 is _9340+20 ? 
! Instantiation error in argument 2 of is/2
! goal:  _9979 is _9982+20
       14      4 Exception: _9897 is _9340+20 ? 
! Instantiation error in argument 2 of is/2
! goal:  _9418 is _9421+20
       13      3 Exception: roulette_wheel_iteration([[20,[2,2,2]],[50,[5,5,5]]],_9340,12,_597) ? 
! Instantiation error in argument 2 of is/2
! goal:  _8894 is _8897+20
       10      2 Exception: roulette_wheel_iteration([[10,[1,1,1]],[20,[2,2,2]],[50,[5,5,5]]],0,12,_597) ? 
! Instantiation error in argument 2 of is/2
! goal:  _911 is _914+20
        1      1 Exception: roulette_wheel([[10,[1,1,1]],[20,[2,2,2]],[50,[5,5,5]]],_597) ? 
! Instantiation error in argument 2 of is/2
! goal:  _114 is _117+20

Может кто-нибудь сказать мне, почему это терпит неудачу?

1 Ответ

1 голос
/ 30 ноября 2011

Сбой, потому что оператор is не допускает необоснованные переменные в правом операнде.

В вашем примере Counter не создан.Я предполагаю, что проблема в том, как вы используете ;/2.

Рассмотрите эту модификацию вашего кода:

roulette_wheel_iteration([[Fitness,Individual]|Tail], Counter, Target, Result) :-
    CounterX is Counter + Fitness,
    (CounterX >= Target -> (Result = Individual); roulette_wheel_iteration(Tail, CounterX, Target, Result)).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...