我在Prolog练习中遇到问题。我正在尝试独自在家学习计算机科学,并且正在做一系列从互联网上进行的练习。
问题如下;
构造一个称为
filteringPairsAtoms/3
的谓词,以便在给定一个原子(第一个参数)和一个对的列表的情况下,通过仅选择具有第一个成分作为对的对,将第三个参数与过滤后的对的列表统一。第一个参数的原子。
示例
filteringPairsAtoms(sA,[[basA,absAb],[ab,bbsA],[sA,abbsB],[bsA,sAsB],[sA,bb]],X)
必须导致
X = [[sA,abbsB],[sA,bb]]
我正在尝试解决问题,但是我没有人要问,因为我一个人在学习,没有教授写东西。
欢迎任何帮助。
谢谢!
答案 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).
,并将其完全执行到最后。