序言列表和过滤

时间:2018-07-05 02:53:15

标签: list prolog filtering

我在Prolog练习中遇到问题。我正在尝试独自在家学习计算机科学,并且正在做一系列从互联网上进行的练习。

问题如下;

  

构造一个称为filteringPairsAtoms/3的谓词,以便在给定一个原子(第一个参数)和一个对的列表的情况下,通过仅选择具有第一个成分作为对的对,将第三个参数与过滤后的对的列表统一。第一个参数的原子。

示例

filteringPairsAtoms(sA,[[basA,absAb],[ab,bbsA],[sA,abbsB],[bsA,sAsB],[sA,bb]],X)  

必须导致

X = [[sA,abbsB],[sA,bb]]

我正在尝试解决问题,但是我没有人要问,因为我一个人在学习,没有教授写东西。

欢迎任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以从已有的东西开始:

filteringPairsAtoms(sA, [[basA,absAb],[ab,bbsA],[sA,abbsB],[bsA,sAsB],[sA,bb]], X) :-
    X = [[sA,abbsB],[sA,bb]].

这是一个很好的开始。但是我们知道更多:肯定是这种情况

filteringPairsAtoms(sA, [[sA,abbsB],[bsA,sAsB],[sA,bb]], X) :-
    X = [[sA,abbsB],[sA,bb]].

%% and
filteringPairsAtoms(sA, [[bsA,sAsB],[sA,bb]], X) :-
    X = [[sA,bb]].

%% and
filteringPairsAtoms(sA, [[sA,bb]], X) :-
    X = [[sA,bb]].

%% and
filteringPairsAtoms(sA, [], X) :-
    X = [].

比较顺序条款,我们还注意到它必须是

filteringPairsAtoms(sA, [[sA,abbsB] | [[bsA,sAsB],[sA,bb]] ], X) :-
    sA = sA,
    X = [[sA,abbsB] | Y],
    filteringPairsAtoms(sA, [[bsA,sAsB],[sA,bb]], Y).

(这只是上面的前两个子句的总和);和

filteringPairsAtoms(sA, [[bsA,sAsB] | [[sA,bb]] ], X) :-
    dif( sA, bsA),
    X = Y,
    filteringPairsAtoms(sA, [[sA,bb]], Y).

剩下要做的就是通过用逻辑变量替换具体术语来概括。像这样:

filteringPairsAtoms(SA, [Head | Tail ], X) :-
    Head = [BsA, _]
    dif( SA, BsA),
    X = Y,
    filteringPairsAtoms(SA, Tail, Y).

,并将其完全执行到最后。