序言:筛选和列出 [英] Prolog: Filter and list
问题描述
构造一个称为fPairsAtoms/3的谓词,以便给定一个原子(第一个参数)和一个对对,通过仅选择具有第一个成分作为对的原子的对,将第三个参数与过滤后的对对统一起来.第一个论点.
Construct a predicate called fPairsAtoms/3 so that given an atom (first argument), and a list of pairs, unify a third parameter with the filtered list of pairs by selecting only the pairs that have the first component as the atom of the first argument.
示例:
fPairsAtoms(sA,[[basA,absAb],[ab,bbsA],[sA,abbsB],[bsA,sAsB],[sA,bb]],X)
结果:
X = [[sA,abbsB],[sA,bb]]
我不明白.....我应该面对这些类型的练习吗? 您能帮我找到解决方法吗?
I do not understand ..... What should I face these types of exercises? Can you help me find a solution?
今天,我从序言开始,我在各个方面都是新手.
推荐答案
如果您今天才刚刚开始,那么现在解决该问题可能还为时过早.
If you've just started today, it probably is a bit too soon for you to tackle this problem.
首先,您应该了解什么是Prolog术语:atoms
,逻辑Variables
,复合术语foo(x,X,bar(baz))
.
First you should understand what Prolog terms are: atoms
, logical Variables
, compound terms foo(x,X,bar(baz))
.
这时您应该了解统一,a = a
,a = A
,A = a
,A = foo(a)
,foo(A) = foo(a)
,[atom, B] = [A, bar]
.
Then you should understand unification, a = a
, a = A
, A = a
, A = foo(a)
, foo(A) = foo(a)
, [atom, B] = [A, bar]
.
您应该了解列表的表示形式,其中
You should understand lists representation, where
[ A, B, C ]
= [A, B | [C] ]
= [A | [B , C ]]
= [A | [B | [C] ]]
= ....
= [A , B , C | []]
,这样统一[A | B] = [a]
成功,也导致统一A = a
和B = []
,但统一[A | B] = []
失败.
so that unifying [A | B] = [a]
succeeds, resulting in also unifying A = a
and B = []
, but unifying [A | B] = []
fails.
然后,您需要了解谓词,在过程解释下,谓词是
Then you need to understand predicates, which under procedural interpretation mean,
to_prove(This) :- need_to_prove(This) , and_also(That).
如此
fPairsAtoms(sA, [[basA,absAb],[ab,bbsA],[sA,abbsB],[bsA,sAsB],[sA,bb]], X) :-
X = [ [sA,abbsB], [sA,bb]].
是一个非常有效的定义,尽管范围非常狭窄.
is a perfectly valid, though exceedingly narrow, definition of one.
但随后也是如此
fPairsAtoms(sA, [[basA,absAb],[ab,bbsA],[sA,abbsB] | [[bsA,sAsB],[sA,bb]] ], X) :-
X = [ [sA,abbsB] | [ [sA,bb]] ].
% and
fPairsAtoms(sA, [ [ab,bbsA],[sA,abbsB] | [[bsA,sAsB],[sA,bb]] ], X) :-
X = [ [sA,abbsB] | [ [sA,bb]] ].
% and
fPairsAtoms(sA, [ [sA,abbsB] | [[bsA,sAsB],[sA,bb]] ], X) :-
X = [ [sA,abbsB] | [ [sA,bb]] ].
% and
fPairsAtoms(sA, [[bsA,sAsB],[sA,bb]] , Y) :-
Y = [ [sA,bb]].
% ... and
fPairsAtoms(sA, [] , Y) :-
Y = [].
等等
fPairsAtoms(sA, [ [sA,abbsB] | L ], X) :-
L = [[bsA,sAsB],[sA,bb]],
Y = [ [sA,bb]],
X = [ [sA,abbsB] | Y ].
因此
fPairsAtoms(sA, [ [sA,abbsB] | L ], X) :-
L = [[bsA,sAsB],[sA,bb]],
fPairsAtoms( L, Y),
Y = [ [sA,bb]],
X = [ [sA,abbsB] | Y ].
% and
fPairsAtoms(sA, [ [sA,abbsB] | L ], X) :-
L = [[bsA,sAsB],[sA,bb]],
fPairsAtoms( L, Y),
X = [ [sA,abbsB] | Y ].
% and
fPairsAtoms(sA, [ [sA,abbsB] | L ], X) :-
fPairsAtoms( L, Y),
X = [ [sA,abbsB] | Y ].
% and so
fPairsAtoms(sA, [ A | L ], X) :-
A = [sA, B ],
fPairsAtoms( L, Y),
X = [ A | Y ].
% and even
fPairsAtoms(SA, [ A | L ], X) :-
A = [SA, B ],
fPairsAtoms( SA, L, Y),
X = [ A | Y ].
但是,另一方面,如果没有匹配项,我们会发现它是
But on the other hand, in cases were there was no match, we saw that it is
fPairsAtoms(SA, [ A | L ], X) :-
A = [SB, B ],
dif( SA, SB),
fPairsAtoms( SA, L, Y),
X = Y .
% i.e.
fPairsAtoms(SA, [ [SB, B ] | L ], X) :-
dif( SA, SB),
fPairsAtoms( SA, L, X) .
所以我们最后得到的两个子句之一
So which one of the two clauses, that we've ended up with,
fPairsAtoms( SA, [ [SA, _] | L ], X) :-
fPairsAtoms( SA, L, Y),
X = [A | Y].
fPairsAtoms( SA, [ [SB, _] | L ], X) :-
dif( SA, SB),
fPairsAtoms( SA, L, X).
是正确的吗?答案是:两者!
is the right one? The answer is: both!
这篇关于序言:筛选和列出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!