Prolog 有没有办法检查输入n是否小于或等于列表的长度?
我不熟悉prolog,我希望得到一个函数: 删除打印列表Y的(N,X,Y),该列表Y是已删除第N个元素的列表X。如果X没有第n个元素,那么谓词应该失败。 例子: 1) 下降(2,[1,2,3,4,5,6],Y)应给出Y=[1,3,4,5,6] 2) 下降(8,[1,2,3,4,5,6],Y)应失败 我试图得到一个函数,如果它不是第n个元素,则将X元素附加到Y元素,如果它是第n个元素,则跳过该元素。请参阅以下代码:Prolog 有没有办法检查输入n是否小于或等于列表的长度?,prolog,Prolog,我不熟悉prolog,我希望得到一个函数: 删除打印列表Y的(N,X,Y),该列表Y是已删除第N个元素的列表X。如果X没有第n个元素,那么谓词应该失败。 例子: 1) 下降(2,[1,2,3,4,5,6],Y)应给出Y=[1,3,4,5,6] 2) 下降(8,[1,2,3,4,5,6],Y)应失败 我试图得到一个函数,如果它不是第n个元素,则将X元素附加到Y元素,如果它是第n个元素,则跳过该元素。请参阅以下代码: drop(N,X,Y) :- integer(N),N>0,drop(X,1
drop(N,X,Y) :- integer(N),N>0,drop(X,1,N,Y).
drop([], _ , _ , [] ) .
drop( [X1|X] , P , N , [X1|Y] ) :- N=\=P , P1 is P+1 , drop(X,P1,N,Y) .
drop( [_|X] , P , N ,Y) :- N =:= P , P1 is P+1 , drop(X,P1,N,Y) .
如果N大于列表的长度,问题就会出现,我的代码将打印整个列表,但在这种情况下,函数应该失败。我无法找到一种方法将N与列表的长度进行比较,因为prolog中的每个函数都返回一个二进制值(据我所知)。
任何帮助都将不胜感激 你们很接近。这里有两件事你应该改变:
drop
上递归,而应该返回列表的其余部分;及drop([],[uu,[uu,[])
行,因为如果我们删除了一个元素,我们将不再递归(请参见上一点)N
的值,从而防止使用两个变量。比如:
drop(N, X, Y) :-
integer(N),
drop_(N, X, Y).
drop_(1, [_|T], T).
drop_(N, [X|T], [X|T2]) :-
N > 1,
N1 is N-1,
drop_(N1, T, T2).
drop(N,X,Y):-
整数(N),
下降(N,X,Y)。
下降(1,[u124; T],T)。
下降(N[X|T],[X|T2]):-
N>1,
N1是N-1,
drop_u(N1,T,T2)。
您非常接近。这里有两件事你应该改变:
drop
上递归,而应该返回列表的其余部分;及drop([],[uu,[uu,[])
行,因为如果我们删除了一个元素,我们将不再递归(请参见上一点)N
的值,从而防止使用两个变量。比如:
drop(N, X, Y) :-
integer(N),
drop_(N, X, Y).
drop_(1, [_|T], T).
drop_(N, [X|T], [X|T2]) :-
N > 1,
N1 is N-1,
drop_(N1, T, T2).
drop(N,X,Y):-
整数(N),
下降(N,X,Y)。
下降(1,[u124; T],T)。
下降(N[X|T],[X|T2]):-
N>1,
N1是N-1,
放下(N1,T,T2)。
这对我来说意义重大,非常感谢!这对我来说意义重大,非常感谢!