prolog中,如何避免重复推理?
prolog吧
全部回复
仅看楼主
level 12
本人想做一个解决下列问题的程序:
在图中有6个位置,5个点,每个点只能沿着图中的边向空位移动。
初始状态如图,现在想将1,2交换位置,其余点不变。
以下是我写的程序(1,2,3,4,5,空 用 a,b,c,d,e,nul 代表)
代码在此:http://pastebin.com/xVDTdjkj
但问题是,探寻路径时会有重复节点出现。
比如,一开始将1移空位,再将1移回原位,再移动1....
请问这一问题怎么解决?谢谢

2012年05月12日 00点05分 1
level 12
比如,我现在将1移到空位,下一步再将1移到空位。
这不就是出现了已有状态。
2012年05月12日 04点05分 3
level 12
这个,是我太不专业了呢?还是我没说清楚。
如果我现在用prolog的推理来探索路径的话。
假设某一步推理是移动1,然后下一步推理还是移动1。
这就又推回了现在的状态,如果这样往复就会陷入死循环。
2012年05月12日 07点05分 5
level 12
有点明白了。但是,写程序不知道该怎么办啊。
这样吧,问题化简成:三角形ABC中,b在A点,a在B点,C点为空。
通过移动调换a,b的位置。
能不能写个程序出来,谢啦?
2012年05月12日 09点05分 7
level 12
当然,我这里有现成的,但是不对。
地址:http://pastebin.com/03PRMery
所以,你要是可以的话,帮我修改一下也行。
2012年05月12日 09点05分 8
level 13
避免重复,当然要保存已经走过的步骤了。具体怎么弄……我现在也做不了
2017年06月18日 17点06分 10
level 13
终于可以自己解决这个问题了:
move(state(A,B,C,D,E,0),state(A,B,C,D,0,E)).
move(state(A,B,C,D,E,0),state(0,B,C,D,E,A)).
move(state(0,B,C,D,E,F),state(B,0,C,D,E,F)).
move(state(0,B,C,D,E,F),state(F,B,C,D,E,0)).
move(state(0,B,C,D,E,F),state(E,B,C,D,0,F)).
move(state(A,0,C,D,E,F),state(0,A,C,D,E,F)).
move(state(A,0,C,D,E,F),state(A,C,0,D,E,F)).
move(state(A,B,0,D,E,F),state(A,0,B,D,E,F)).
move(state(A,B,0,D,E,F),state(A,B,D,0,E,F)).
move(state(A,B,C,0,E,F),state(A,B,0,C,E,F)).
move(state(A,B,C,0,E,F),state(A,B,C,E,0,F)).
move(state(A,B,C,D,0,F),state(A,B,C,0,D,F)).
move(state(A,B,C,D,0,F),state(A,B,C,D,F,0)).
move(state(A,B,C,D,0,F),state(0,B,C,D,A,F)).
solve(Start,Finish):-
solve(Start,Finish,[],Path),
length(Path,X),
reverse([Finish|Path],XPath),
write(X),write(' steps :'),nl,
write(XPath),nl.
solve(Finish,Finish,Path,Path).
solve(Start,Finish,Cache,Path):-
move(Start,Next),
\+ is_member(Next,Cache),
solve(Next,Finish,[Start|Cache],Path).
reverse(A, Z) :- reverse(A, [], Z).
reverse([], Z, Z).
reverse([A|X], SoFar, Z) :- reverse(X, [A|SoFar], Z).
length(L, N) :-length(L, 0, N).
length([], N, N).
length([_|Y], X, N) :-
XX is X + 1,
length(Y, XX, N).
2017年11月19日 08点11分 11
1