2013-02-19 37 views
0

我对prolog非常陌生,并且对8个难题启发式问题有困难。我不知道如何比较两个列表(目标和开始)并找出我的h值。我想要做的是发送compare_list两个列表目标并开始。它应该比较每个头,如果它们不相等,则将其他的总数加1,这是自我递归的。我不知道如果在序言中如果其他语句如何做。解决8个难题启发式问题

%T1,T2,T3 top 
%M1,M2,M3 middle 
%B1,B2,B3 bottom 

goal([1/2/3/8/0/4/7/6/5]). 

%Top row movements 
%shift right 
shift([T1/0/T3/M1/M2/M3/B1/B2/B3], 
     [0/T1/T3/M1/M2/M3/B1/B2/B3]). 

shift([T1/T2/0/M1/M2/M3/B1/B2/B3], 
     [T1/0/T2/M1/M2/M3/B1/B2/B3]). 

%shift left 
shift([T1/T2/T3/M1/M2/M3/B1/B2/B3], 
     [T1/T2/T3/M1/M2/M3/B1/B2/B3]). 

shift([T1/T2/T3/M1/M2/M3/B1/B2/B3], 
     [T1/T2/T3/M1/M2/M3/B1/B2/B3]). 

%shift down 
shift([T1/T2/T3/0/M2/M3/B1/B2/B3], 
     [0/T2/T3/T1/M2/M3/B1/B2/B3]). 

shift([T1/T2/T3/M1/0/M3/B1/B2/B3], 
     [T1/0/T3/M1/T2/M3/B1/B2/B3]). 

shift([T1/T2/T3/M1/M2/0/B1/B2/B3], 
     [T1/T2/0/M1/M2/T3/B1/B2/B3]). 

%Middle row movements 
%shift right 
shift([T1/T2/T3/M1/0/M3/B1/B2/B3], 
     [T1/T2/T3/0/M1/M3/B1/B2/B3]). 

shift([T1/T2/T3/M1/M2/0/B1/B2/B3], 
     [T1/T2/T3/M1/0/M2/B1/B2/B3]). 

%shift left 
shift([T1/T2/T3/0/M2/M3/B1/B2/B3], 
     [T1/T2/T3/M2/0/M3/B1/B2/B3]). 

shift([T1/T2/T3/M1/0/M3/B1/B2/B3], 
     [T1/T2/T3/M1/M3/0/B1/B2/B3]). 

%shift up 
shift([0/T2/T3/M1/M2/M3/B1/B2/B3], 
     [M1/T2/T3/0/M2/M3/B1/B2/B3]). 

shift([T1/0/T3/M1/M2/M3/B1/B2/B3], 
     [T1/M2/T3/M1/0/M3/B1/B2/B3]). 

shift([T1/T2/0/M1/M2/M3/B1/B2/B3], 
     [T1/T2/M3/M1/M2/0/B1/B2/B3]). 

%shift down 
shift([T1/T2/T3/M1/M2/M3/0/B2/B3], 
     [T1/T2/T3/0/M2/M3/M1/B2/B3]). 

shift([T1/T2/T3/M1/M2/M3/B1/0/B3], 
     [T1/T2/T3/M1/0/M3/B1/M2/B3]). 

shift([T1/T2/T3/M1/M2/M3/B1/B2/0], 
     [T1/T2/T3/M1/M2/0/B1/B2/M3]). 

%bottom row movements 

%shift right 
shift([T1/T2/T3/M1/M2/M3/B1/0/B3], 
     [T1/T2/T3/M1/M2/M3/0/B1/B3]). 

shift([T1/T2/T3/M1/M2/M3/B1/B2/0], 
     [T1/T2/T3/M1/M2/M3/B1/0/B2]). 

%shift left 
shift([T1/T2/T3/M1/M2/M3/0/B2/B3], 
     [T1/T2/T3/M1/M2/M3/B2/0/B3]). 

shift([T1/T2/T3/M1/M2/M3/B1/0/B3], 
     [T1/T2/T3/M1/M2/M3/B1/B3/0]). 

%shift up 
shift([T1/T2/T3/0/M2/M3/B1/B2/B3], 
     [T1/T2/T3/B1/M2/M3/0/B2/B3]). 

shift([T1/T2/T3/M1/0/M3/B1/B2/B3], 
     [T1/T2/T3/M1/B2/M3/B1/0/B3]). 

shift([T1/T2/T3/M1/M2/0/B1/B2/B3], 
     [T1/T2/T3/M1/M2/B3/B1/B2/0]). 


h(State):- 
    compare_list(State, goal, 1). 

compare_list([H1 | T1], [H2 | T2], I) :- 
    H1 \= H2, 
    compare_list(T1, T2, I1), 
    I is I1 +1. 
+0

我不知道为什么Prolog从来没有真正抓到... – 2013-02-19 03:04:44

回答

0

当然,你使用的是错误的语法:列表使用逗号作为分隔符。例如

goal([1,2,3,8,0,4,7,6,5]). 

我认为你可以做一个全局搜索和替换,一次做所有的更改。 之后,compare_list/3可以开始工作,但我想知道计数器I的效用。这似乎没用。

而我不能发现其中你应用这些班次。然后,我不确定您是否正在寻求解决方案。

如果你有兴趣,我发布前几天this答案。对不起,这和你的完全不同。