List 输出似乎只测试列表中最后一个差分函数
链接到旧问题: 我已经在另一个问题帖子中发布了我的进度,但这是我的代码,我正试图用Prolog解决这个问题。我希望我的函数返回sameseqdiff([3,5,7],2]的结果,这取决于每个数字之间的差值是否与我的上一个参数相同。以下是我到目前为止所做的:List 输出似乎只测试列表中最后一个差分函数,list,recursion,prolog,List,Recursion,Prolog,链接到旧问题: 我已经在另一个问题帖子中发布了我的进度,但这是我的代码,我正试图用Prolog解决这个问题。我希望我的函数返回sameseqdiff([3,5,7],2]的结果,这取决于每个数字之间的差值是否与我的上一个参数相同。以下是我到目前为止所做的: sameSeqDiffs([X,Y], Result):- A is Y - X, A = Result. sameSeqDiffs([X,Y,Z|T], Result):- sameSeqDiffs([Y,Z|T]
sameSeqDiffs([X,Y], Result):-
A is Y - X,
A = Result.
sameSeqDiffs([X,Y,Z|T], Result):-
sameSeqDiffs([Y,Z|T], Result).
当我测试此代码时,它似乎对某些输入有效,但对其他输入显然无效:
您的解决方案存在一些问题:
sameSeqDiffs([X,Y,Z|T], Result):-
sameSeqDiffs([Y,Z|T], Result).
这里完全忽略变量X和差X-Y
sameSeqDiffs([X,Y], Result):-
Result is Y - X.
sameSeqDiffs([X,Y,Z|T], Result):-
Result is Y - X,
sameSeqDiffs([Y,Z|T], Result).
实际上,您忘记了一件事:在递归情况下计算差异: 然后我们得到以下结果:
?- sameSeqDiffs([3, 5, 7], D).
D = 2 ;
false.
?- sameSeqDiffs([3, 5, 7], 2).
true ;
false.
?- sameSeqDiffs([3, 5, 7], 4).
false.
?- sameSeqDiffs([2, 3, 4], 1).
true ;
false.
?- sameSeqDiffs([2, 3, 4, 6], 2).
false.
?- sameSeqDiffs([2, 3, 4, 6], 1).
false.
它在
true
之后返回false
,这是因为Prolog回溯并旨在找到另一个解决方案。所以如果它打印true;false。
我们知道尝试成功,因此谓词成功。对于此类问题,现在是了解CLP(FD)的好时机,CLP(FD)是Prolog中用于对整数进行推理的部分:
same_seq_dif([X,Y], R) :- Y - X #= R.
same_seq_dif([X,Y,Z|T], R) :-
Y - X #= R,
same_seq_dif([Y,Z|T], R).
除了在提供完全实例化的列表时产生正确的结果外,它还知道如何处理更一般的情况:
| ?- same_seq_dif([X,5,7], R).
R = 2
X = 3 ? ;
no
| ?- length(L,3), same_seq_dif(L, 3), fd_labeling(L).
L = [0,3,6] ? ;
L = [1,4,7] ? ;
L = [2,5,8] ? ;
L = [3,6,9] ? ;
L = [4,7,10] ?
...
我使用的是GNU Prolog,因此是fd\u labeling/1
谓词。SWI有一个类似的谓词,label/1
same_seq_dif([X,Y], R) :- Y - X #= R.
same_seq_dif([X,Y,Z|T], R) :-
Y - X #= R,
same_seq_dif([Y,Z|T], R).
| ?- same_seq_dif([X,5,7], R).
R = 2
X = 3 ? ;
no
| ?- length(L,3), same_seq_dif(L, 3), fd_labeling(L).
L = [0,3,6] ? ;
L = [1,4,7] ? ;
L = [2,5,8] ? ;
L = [3,6,9] ? ;
L = [4,7,10] ?
...