Prolog 有没有办法检查输入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

我不熟悉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,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)。
    这对我来说意义重大,非常感谢!这对我来说意义重大,非常感谢!