Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何在mxn表中查找路径_Haskell - Fatal编程技术网

Haskell 如何在mxn表中查找路径

Haskell 如何在mxn表中查找路径,haskell,Haskell,我有表m x n和点对。例如,我们可以有表3 x 3和点对: A=(1,3)、(3,2) B=(1,2)、(3,1) 我必须找到所有成对连接点的路径。这些路径不能相互相交。我们可以从左、右、下、上进入。在前面的示例中,我们有以下路径: A=(1,3)->(2,3)->(3,3)->(3,2) B=(1,2)->(2,2)->(2,1)->(3,1) (如果有更多的解决方案,我想全部解决) 有人知道我在哈斯克尔怎么做吗 也许你可以用语言来解释你的Prolog算法 好的,而且我有我的代码,所以:

我有表m x n和点对。例如,我们可以有表3 x 3和点对:

A=(1,3)、(3,2) B=(1,2)、(3,1)

我必须找到所有成对连接点的路径。这些路径不能相互相交。我们可以从左、右、下、上进入。在前面的示例中,我们有以下路径:

A=(1,3)->(2,3)->(3,3)->(3,2) B=(1,2)->(2,2)->(2,1)->(3,1)

(如果有更多的解决方案,我想全部解决)

有人知道我在哈斯克尔怎么做吗


也许你可以用语言来解释你的Prolog算法

好的,而且我有我的代码,所以:

我有四个谓词,左、右、上、下

go((I1,J1),(I2,J2),_,_) :-
    J1 is J2,
    I2>=2,
    I1 is I2 - 1.

go((I1,J1),(I2,J2),_,N) :-
    I1 is I2,
    J2=<N-1,
    J1 is J2 + 1.

go((I1,J1),(I2,J2),M,_) :-
    J1 is J2,
    I2=<M-1,
    I1 is I2 + 1.

go((I1,J1),(I2,J2),_,_) :-
    I1 is I2,
    J2>=2,
    J1 is J2 - 1.
当然,参数5是表的大小-这里我们有表5x5

我必须知道,什么时候是路的尽头,所以我写道:

endOfPath((I1,J1),(I2,J2)) :-
    I1 == I2,
    J1 == J2.
然后我可以做一个谓词,它将生成从点(I1,J1)到(I2,J2)的路径。首先,我们必须检查它是否为路径的末尾:

generatePath((I1,J1),(I2,J2),T,T,_,_,_,B,B) :-
    endOfPath((I1,J1),(I2,J2)),!.
若它不是路径的末端,我们必须递归地生成路径

generatePath((I1,J1),(I2,J2), Acc,T,M,N,Input,Bufor,NewBufor) :-
    go((I3,J3),(I2,J2),M,N),
    \+ member((I3,J3),Bufor),
    \+ member((I3,J3),Acc),
    \+ member((I3,J3),Input),
    generatePath((I1,J1),(I3,J3),[(I3,J3)|Acc],T,M,N,Input,[(I3,J3)|Bufor],NewBufor).
因此,首先我们找到(I2,J2)旁边的点,然后我们检查几个条件(例如,如果(I3,J3)属于任何其他路径-它是错误的点)。然后我们递归地生成从(I1,J1)到(I3,J3)的路径。我们有问题,当(I3,J3)是路径的末尾时,因为(I3,J3)属于输入,并且条件+成员((I3,J3,Input)未满足

因此,我写了最后一个谓词:

generatePath((I1,J1),(I2,J2), Acc,T,M,N,Input,Bufor,NewBufor) :-
    go((I3,J3),(I2,J2),M,N),
    \+ member((I3,J3),Acc),
    I3 == I1, J3 == J1,
    generatePath((I1,J1),(I3,J3),[(I3,J3)|Acc],T,M,N,Input,[(I3,J3)|Bufor],NewBufor).

这很容易,而且效果也很好,但我不知道如何在哈斯克尔做到这一点。真的,我有一个很大的问题,请帮助我。

您的代码翻译为

gomn(i,j)=
[(i+1,j)| i1]++
[(i,j+1)| j1]
--isEndOfPath p q=p==q
genPath p q acc m n input buf=head$--因为这里有一个切口
g p q acc buf
哪里
g p q acc buf | p==q=[(acc,buf)]--返回acc,buf
g p q acc buf=[s|

r你尝试过什么?你能用任何其他语言解决问题并在haskell中实现它吗?这看起来是一个算法问题,在你说出你在haskell实现中遇到的困难和需要帮助之前,它与haskell无关。我在Prolog中完成了这项任务。但我不知道如何在两点之间找到任何路径。在pr中olog这很简单,但我不知道如何在Haskell中做到这一点。如何在两点之间找到任何路径?我想你也可以标记prolog并添加你尝试过的prolog代码。你必须向另一点移动吗?B路径可以从(1,2)->(1,3)开始吗?@DiegoNolan-B路径不能从(1,2)->(1,3)开始,因为点(1,3)属于路径A(这是该路径的起点)。
generatePath((I1,J1),(I2,J2), Acc,T,M,N,Input,Bufor,NewBufor) :-
    go((I3,J3),(I2,J2),M,N),
    \+ member((I3,J3),Acc),
    I3 == I1, J3 == J1,
    generatePath((I1,J1),(I3,J3),[(I3,J3)|Acc],T,M,N,Input,[(I3,J3)|Bufor],NewBufor).