序言:筛选和列出 [英] Prolog: Filter and list

查看:73
本文介绍了序言:筛选和列出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

构造一个称为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 = aa = AA = aA = 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 = aB = [],但统一[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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆