Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
List 输出似乎只测试列表中最后一个差分函数_List_Recursion_Prolog - Fatal编程技术网

List 输出似乎只测试列表中最后一个差分函数

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]

链接到旧问题:

我已经在另一个问题帖子中发布了我的进度,但这是我的代码,我正试图用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], 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] ?
...