gpt4 book ai didi

PROLOG 列表过滤器谓词不回答真或假

转载 作者:行者123 更新时间:2023-12-02 05:04:31 25 4
gpt4 key购买 nike

我正在尝试制作一个谓词,它采用两个向量/列表并将第一个向量/列表用作过滤器。例如:

?- L1=[0,3,0,5,0,0,0,0],L2=[1,2,3,4,5,6,7,8],filter(L1,L2,1).
L1 = [0, 3, 0, 5, 0, 0, 0, 0],
L2 = [1, 2, 3, 4, 5, 6, 7, 8] .

这就是我得到的,但我想要 truefalse 如果 L2 有 3 作为第二个元素,5 作为第四个元素,等等。 0 被忽略,这是“过滤”条件。我从输入中知道 L1 和 L2 总是 length=8 并且只有 L1 有 0

我的代码是:

filter(_,_,9).
filter([Y|T],V2,Row):-
Y=:=0,
NewRow is Row + 1,
filter([Y|T],V2,NewRow).

filter([Y|T],V2,Row):-
Y=\=0,
nth(Row,[Y|T],X1),
nth(Row,V2,X2),
X1=:=X2,
NewRow is Row + 1,
filter([Y|T],V2,NewRow).


nth(1,[X|_],X).
nth(N,[_|T],R):- M is N-1, nth(M,T,R).

我知道有更好的方法来实现这个功能,例如将第一个元素的第一个元素与第二个元素的第 n 个元素进行比较,并通过递归删除第一个元素的头部,但我只是想知道为什么我没有得到truefalse,或任何“返回”值。

有人可以帮我吗?让它工作

新代码:

filter([],R,_,R).
filter([Y|T],V2,Row,R):-
Y=:=0,
NewRow is Row + 1,
filter(T,V2,NewRow,R).

filter([Y|T],V2,Row,R):-
Y=\=0,
nth(Row,V2,X2),
Y=:=X2,
NewRow is Row + 1,
filter(T,V2,NewRow,R).

预期行为示例:

permutation([1,2,3,4,5,6,7,8],X),filter([1,2,3,4,0,0,0,0],X,1,R).
X = R, R = [1, 2, 3, 4, 5, 6, 7, 8] ;
X = R, R = [1, 2, 3, 4, 5, 6, 8, 7] ;
X = R, R = [1, 2, 3, 4, 5, 7, 6, 8] ;
X = R, R = [1, 2, 3, 4, 5, 7, 8, 6] .

现在我可以获得以 1,2,3,4 开头的所有排列。如果有人知道实现相同目标的更好方法,请分享,但我已经得到了我需要的=)。

最佳答案

似乎是 maplist/3 的完美任务

filter(L1, L2, _) :-
maplist(skip_or_match, L1, L2).

skip_or_match(E1, E2) :- E1 == 0 ; E1 == E2.

产量

?- permutation([1,2,3,4,5,6,7,8],X),filter([1,2,3,4,0,0,0,0],X,_).
X = [1, 2, 3, 4, 5, 6, 7, 8] ;
X = [1, 2, 3, 4, 5, 6, 8, 7] ;
X = [1, 2, 3, 4, 5, 7, 6, 8] ;
X = [1, 2, 3, 4, 5, 7, 8, 6] ;
...

我们可以做得更有用,使用 Prolog 工具 - 即,使用匿名变量来表达不关心

那么filter/N就是maplist的简单应用:

?- permutation([1,2,3,4,5,6,7,8],X),maplist(=,[1,2,3,4,_,_,_,_],X).
X = [1, 2, 3, 4, 5, 6, 7, 8] ;
X = [1, 2, 3, 4, 5, 6, 8, 7] ;
X = [1, 2, 3, 4, 5, 7, 6, 8] ;
X = [1, 2, 3, 4, 5, 7, 8, 6] ;
...

关于PROLOG 列表过滤器谓词不回答真或假,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16492172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com