【问题标题】:Prolog list and filteringProlog列表和过滤
【发布时间】:2018-12-13 10:22:10
【问题描述】:

我对 Prolog 练习有疑问。我正在尝试独自在家学习计算机科学,并且正在做一系列从互联网上获取的练习。

问题如下;

构造一个名为filteringPairsAtoms/3 的谓词,以便给定一个原子(第一个参数)和一个对列表,通过仅选择具有第一个组件作为原子的对,将第三个参数与过滤后的对列表统一起来第一个参数。

例子

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

必须导致

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

我正在尝试解决它,但我没有人可以问,因为我是一个人学习,没有教授可以写信或其他什么。

欢迎任何帮助。

谢谢!!!

【问题讨论】:

  • 到目前为止你尝试过什么?请提供您尝试过的步骤以及您可能对此提出的任何具体问题。
  • 我在列表中使用了递归搜索,但我还没有任何积极的结果。
  • 你可以向我们展示你得到的任何东西。任何代码,任何尝试都可以。所以我们可以看到你的困难在哪里。否则它会在黑暗中拍摄。
  • @Emily_1990 有点跑题了,但是既然你是自学,你可以先把时间花在更有条理和简单的任务上,比如经典的Ninety-Nine Prolog Problems。然后你可以在你的问题中添加有用的细节,比如“我不明白这个问题,但我明白这些以及这些更简单的相关问题”(在这种情况下,即使是rubber duck 也可以像教授一样帮助你。)
  • 除了 Kirill 之外,还有很多很棒的 Prolog 书籍可供自学,而且几十年来语言没有太大变化,因此即使是相当古老的书籍仍然可以提供帮助。我会推荐 Clocksin & Mellish 的 Programming in Prolog 或 Sterling & Shapiro 的 Art of Prolog

标签: list prolog filtering


【解决方案1】:

你可以从已有的开始:

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).

并将其完全执行到最后。

【讨论】:

  • 感谢您的快速答复。我试图运行脚本做相当多的修改,但毕竟,我得到了这个错误:{“code”:500,“message”:“Arguments are not enough instantiated”}
  • 我试图在这里给你一些提示,这样你就可以自己找到工作代码......你可以在 StackOverflow 上发布新问题,包括你的完整新代码、测试查询和你的回复从您的 Prolog 提示中获取(也请指定您正在使用的实现),包括完整的错误消息。还包括指向此问题的链接,以获取上下文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
相关资源
最近更新 更多