我们想构建一个谓词,获得一个列表L
和一个数字N
,如果N
是列表L
的最长序列的长度,则该谓词为true。 例如:序言 - 列表中的序列
?- ls([1,2,2,4,4,4,2,3,2],3).
true.
?- ls([1,2,3,2,3,2,1,7,8],3).
false.
为此,我建 -
head([X|S],X). % head of the list
ls([H|T],N) :- head(T,X),H=X, NN is N-1 , ls(T,NN) . % if the head equal to his following
ls(_,0) :- !. % get seq in length N
ls([H|T],N) :- head(T,X) , not(H=X) ,ls(T,N). % if the head doesn't equal to his following
的概念很简单 - 检查头等于他的下面,如果是的话,继续与尾部和递减N
。
我检查了我的代码,它工作得很好(忽略案件N = 1
) -
ls([1,2,2,4,4,4,2,3,2],3).
true ;
false .
但true
答案不是有限的,后面也有更多的答案,我怎么能让它返回有限回答?
谢谢!这非常有用。 – URL87 2013-02-28 11:45:52
@Daniel_Lyons:如果你能解释一下我会很高兴, 正如你所说'once'确保我们只得到1个答案,但是如果我们忽略这个'once'并保留 - sequence_length_loop(X,Xs, 1,长度)',可以检查哪些更多的检查会得到更多结果?这里是我们只发送给'sequence_length_loop'的实例化参数'(X,Xs,1,Length)'...... – URL87 2013-02-28 14:14:11
@ URL87我们得到一个没有'once'的虚假选择点,就像你在原来的那样。我在这里选择了“一次”,因为我觉得在每个其他目标之后引入一个切换更加整洁,它比循环目标之后的切换更清楚地表达目的。 – 2013-02-28 14:58:44