【问题标题】:How to implement list concatenation in Prolog?如何在 Prolog 中实现列表连接?
【发布时间】:2012-12-20 17:14:13
【问题描述】:

我有以下紧凑示例,它采用 3 个参数 L1、L2、L3 并在 L3 中附加 L1 和 L2(验证 L3 是 L1 和 L2 的串联)

我有这段代码(效果很好):

myappend([], L, L).
myappend([X|L1], L2, [X|L]) :- myappend(L1,L2,L).

事实是基本情况,并且说当第一个列表是空列表时,第一个列表与第二个列表的连接就是第二个列表

好的,这很清楚......规则对我来说很清楚(但一点也不)我可以认为这条规则是测试第一个、第二个和第三个参数是否具有第一个和第二个连接关系的谓词是第三个参数

好的,我正在尝试以扩展形式表达前面的代码,其中我有这个规则的主体,它代表之前必须满足(必须为 TRUE)的所有谓词,以便规则的头部自己满意。

我在 SWI Prolog 中实现此代码时遇到一些问题,这是我的代码:

concatena([],L,L).

/* REGOLA */

concatena(L1,L2,L3) :- L1 = [_|T],          /* Always true: anonymous variable: "_" unifies everything */
               concatena(T,L2,L3).     /* Recursively call on the tail of L1 */
           [X|L1],
           [X|L3].

事实是基本情况(如前面的工作示例)

在我的实验中,规则是不同的。

为了验证规则的头部,它的主体中的所有谓词都必须为真......

我认为在达到基本情况之前我的想法是好的,实际上是这样做的:

L1 = [_|T],         /* It is always true */
concatena(T,L2,L3)  /* Call recursively on a subproblem of the original problem, this problem have one less element

好的,这样就达到了基本情况,因此 L3 与 L2 正确统一

其实在我的追踪中:

[trace] 3 ?- concatena([a,b],[c,d],L3).
   Call: (6) concatena([a, b], [c, d], _G1514) ? creep
   Call: (7) [a, b]=[_G1592|_G1593] ? creep
   Exit: (7) [a, b]=[a, b] ? creep
   Call: (7) concatena([b], [c, d], _G1514) ? creep
   Call: (8) [b]=[_G1595|_G1596] ? creep
   Exit: (8) [b]=[b] ? creep
   Call: (8) concatena([], [c, d], _G1514) ? creep
   Exit: (8) concatena([], [c, d], [c, d]) ? 

(这与我查看原始工作示例的痕迹时发生的情况相同......所以直到这里应该更正)

问题是程序做回溯的时候,不行!!!

在跟踪中其实我有这个(这是结束之前不完整跟踪的方式):

Exit: (7) concatena([b], [c, d], [c, d]) ? creep
   Exit: (6) concatena([a, b], [c, d], [c, d]) ? creep
L3 = [c, d] 

【问题讨论】:

  • 嗨,安德里亚,你会被否决,并且问题可能会因为重复而被关闭……最好在这里用 cmets 完成一个主题。请注意,您的代码中有一个错字:concatena(T,L2,L3). 后面有一个点
  • 嗯好的……以后我会更加小心的。谢谢你告诉我

标签: prolog declarative


【解决方案1】:

我不完全清楚你在这里要做什么:重写 myappend 规则的第二部分,以便所有参数都是简单的变量项?在这种情况下,您可以使用 = 运算符重写原始 myappend 的参数:

concatena(L1,L2,L3) :- L1=[X|T], L3=[X|L4], concatena(T,L2,L4).

规则的第二部分,正如你在这里写的,

[X|L1],
[X|L3].

不被算作规则的一部分,因为它遵循 .,因此没有回溯,并且在递归展开时没有任何事情发生。

【讨论】:

    猜你喜欢
    • 2014-06-25
    • 2016-11-12
    • 2016-01-15
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多