我将尝试比较这些列表。给定函数(List1, List2),其中List1的长度为N,List2的长度为M且N>M。
我想要检查List2的任何排列是否恰好是List1的前M个字符。
例如:
predicate([a,c,b,d,e],[a,b,c,d]).
应该是真的
predicate([a,c,b,e,d],[a,b,c,d]).
应该为假。
谢谢。
通常情况下,当描述列表之间的关系时,DCG在这种情况下是很方便的:
perm_prefix(Ls1, Ls2) :- phrase(perm(Ls2), Ls1, _).
perm([]) --> [].
perm(Ls0) --> [L], { select(L, Ls0, Ls1) }, perm(Ls1).
示例案例:
?- perm_prefix([a,c,b,d,e],[a,b,c,d]).
true
?- perm_prefix([a,c,b,e,d],[a,b,c,d]).
false.
perm(Xs,Ys) :- phrase(perm(Xs),[],Ys)。 perm([])-->[]。 perm([X|Xs])-->perm(Xs),ins(X)。归属:Prolog 时刻,展品 0
ins(X),[X]-->[]。 ins(X),[Y]-->[Y],ins(X)。
permutation/2
和prefix/2
谓词,您可以编写类似以下内容的代码:has_prefix_perm(List1, List2) :-
permutation(List2, Permutation),
prefix(Permutation, List1),
!.
has_prefix_perm/2
,特别是如果它不是模排列前缀,因为所有情况都将被测试。has_prefix_perm(_, []) :- !.
has_prefix_perm([Head1|List1], List2) :-
once(select(Head1, List2, Rest)),
has_prefix_perm(List1, Rest).
这么写,我不会在非地面列表上使用它,但看到你的OP,我没有进一步搜索...
另一种方法是检查List1缩短到List2的长度是否为List2的排列:
has_prefix_perm(List1, List2) :-
length(List2, L),
length(LittleL1, L),
append(LittleL1, _, List1),
permutation(LittleL1, List2),
!.
has_prefix_perm([a,b],[X,Y]).
只能找到一个解决方案。 - falsehas_prefix_perm([a,b,c],[X,a,c])
时,它应该成功并返回X = b
,但实际上却失败了。 - false!
和once/1
只会破坏语义。 - false