Re: [eclipse-users] Hash tables inside loops inside minimize don't work

From: Kish Shen <kisshen_at_cisco.com>
Date: Thu, 12 Jul 2007 01:47:27 +0100
Hi David,

The problem is because the goal inside minimize/2 (and other predicates 
where you give the goal to be executed as an argument) is not compiled, 
but is expanded and interpreted at run-time. This expansion treats
the hash table variable TheHash, passed via param(TheHash), as a normal 
logical variable, i.e. it does not change while the loop is executed. 
Unfortunately, the hash table should be updated non-logically in each 
iteration, and this is not expanded correctly.

The work-around is to move the loop, or the whole goal (as suggested by 
Joachim), out to an auxillary predicate.
Here is an example of moving the loop:

test_hash(Keys, Values) :-
    List = [1, 2, 3],
    minimize(
                ( X :: 1 .. 10,
                  indomain(X),
                  Y #= -X,
                  hash_create(TheHash),
                  loop(List, TheHash),
                  hash_list(TheHash, Keys, Values),
                  hash_count(TheHash, Count),
                  printf("Hash contents after loop %w %w size %w\n", 
[Keys, Values, Count]),
                  hash_list(TheHash, Keys, Values)
                ),        Y ),
    printf( "X %w Y %w\n", [X, Y] ).

loop(List, TheHash) :-
        ( foreach(Key, List), param(TheHash) do
            Val is 2 * Key,
            hash_set(TheHash, Key, Val),
            hash_list(TheHash, Keys, Values),
            hash_count(TheHash, Count),
            printf("Hash contents in loop %w %w size %w\n", [Keys, 
Values, Count])
        ).

In this case, loop/2 is compiled and behaves correctly:

[eclipse 2]: test_hash(K,V).
Hash contents in loop [1] [2] size 1
....
Found a solution with cost -10
Found no solution with cost -1.0Inf .. -11
X 10 Y -10

K = [1, 2, 3]
V = [2, 4, 6]
Yes (0.00s cpu)
[eclipse 3]:

Cheers,

Kish

David Norman wrote:
> I can't seem to get a hash table to update when used inside a do loop 
> inside a minimize goal.  The hash remains empty.  I'm running version 
> 5.10 #77 on windows.
>  
> Any ideas?
>
> Thanks,
> David
>  
>  
> Sample Code:
>  
> :- lib(hash).
> :- lib(ic).
> :- lib(branch_and_bound).
> test_hash(Keys, Values) :-
>     List = [1, 2, 3],
>    
>     minimize(
>         (
>             X :: 1 .. 10,
>             indomain(X),
>             Y #= -X,
>             hash_create(TheHash),
>             (
>                 foreach(Key, List),
>                 param(TheHash)
>             do
>                 Val is 2 * Key,
>                 hash_set(TheHash, Key, Val),
>                 hash_list(TheHash, Keys, Values),
>                 hash_count(TheHash, Count),
>                 printf("Hash contents in loop %w %w size %w\n", [Keys, 
> Values, Count])
>             ),
>             hash_list(TheHash, Keys, Values),
>             hash_count(TheHash, Count),
>             printf("Hash contents after loop %w %w size %w\n", [Keys, 
> Values, Count]),
>            
>             hash_list(TheHash, Keys, Values)
>         ),
>         Y ),
>        
>     printf( "X %w Y %w\n", [X, Y] ).
>  
>  
> Execution:
>  
> ?- test_hash(Keys, Values).
> Keys = []
> Values = []
> Yes (0.02s cpu)
>
>  
> Output:
>  
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents after loop [] [] size 0
> Found a solution with cost -1
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents after loop [] [] size 0
> Found a solution with cost -2
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents after loop [] [] size 0
> Found a solution with cost -3
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents after loop [] [] size 0
> Found a solution with cost -4
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents after loop [] [] size 0
> Found a solution with cost -5
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents after loop [] [] size 0
> Found a solution with cost -6
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents after loop [] [] size 0
> Found a solution with cost -7
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents after loop [] [] size 0
> Found a solution with cost -8
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents after loop [] [] size 0
> Found a solution with cost -9
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents in loop [] [] size 0
> Hash contents after loop [] [] size 0
> Found a solution with cost -10
> Found no solution with cost -1.0Inf .. -11
> X 10 Y -10
>
>  
>
> ------------------------------------------------------------------------
> PC Magazine’s 2007 editors’ choice for best web mail—award-winning 
> Windows Live Hotmail. Check it out! 
> <http://imagine-windowslive.com/hotmail/?locale=en-us&ocid=TXT_TAGHM_migration_HMWL_mini_pcmag_0707> 
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> ECLiPSe-Users mailing list
> ECLiPSe-Users_at_crosscoreop.com
> http://www.crosscoreop.com/mailman/options/eclipse-users
>   
Received on Thu Jul 12 2007 - 01:47:49 CEST

This archive was generated by hypermail 2.2.0 : Thu Feb 02 2012 - 02:31:58 CET