prolog规则的提取算法

prolog规则的提取算法,prolog,logic,artificial-intelligence,Prolog,Logic,Artificial Intelligence,我必须在prolog中创建一些“谓词列表”。 但我并不完全理解这种思维方式 如果我想创建一些工作谓词,我必须学习 我看过一些流行的教程(也许我搜索得不够精确),但我找不到任何教程教我如何使用真正基本的步骤规划算法 例如 任务: 编写一个concat(X,Y,Z)。谓词,从列表X和Y中提取元素,并将它们连接到列表Z 我的分析算法: 首先,我将要连接的元素数量(列表的长度X和Y)定义为非负整数(XCount>=0和YCount>=0)。然后我为第一种情况创建一个谓词,即XCount=0和YCount

我必须在prolog中创建一些“谓词列表”。 但我并不完全理解这种思维方式 如果我想创建一些工作谓词,我必须学习

我看过一些流行的教程(也许我搜索得不够精确),但我找不到任何教程教我如何使用真正基本的步骤规划算法

例如

任务:

编写一个
concat(X,Y,Z)。
谓词,从列表
X
Y
中提取元素,并将它们连接到列表
Z

我的分析算法:

首先,我将要连接的元素数量(列表的长度
X
Y
)定义为非负整数(XCount>=0和YCount>=0)。然后我为第一种情况创建一个谓词,即XCount=0和YCount=0:

。。。然后测试它,发现它适用于第一种情况

然后,我为第二种情况创建一个谓词,其中XCount=1和YCount=0,如下所示:

。。。然后再次测试它,发现它正在以一些意想不到的积极结果工作

结果:

我可以看到这个算法不仅适用于XCount=1,而且适用于XCount=0。因此我可以删除
concat([],[],[])。
并且只有
concat(X,[],[],[])。
,因为
X=[]
内部谓词
concat(X,[],[])。
concat([],[])相同。

第二个意外结果是,该算法不仅适用于0,1中的XCount,而且适用于所有XCount>=0

然后我分析域并搜索尚未处理的元素,发现最简单的方法是为YCount>0创建第二个谓词

记住,仅使用X作为第一个参数可以覆盖所有XCount>=0,我为YCount=1和所有X创建了一个案例,即:

这就是我的算法导致大脑缓冲区溢出的地方

关于stackoverflow规则,我的要求很明确

问题:

  • 有没有办法自己找到答案?我的意思是-不是问题的答案,而是我所展示的解决问题的算法。 换句话说,我的算法的算法

  • 如果你能回答问题1,我以后怎么能找到这种暗示呢?我的问题有具体的名字吗

  • 我必须做到多精确——我可以尝试用多少种情况和什么语言来实现我的算法,这不仅仅是“做”事情,而是“思考”如何规划和创建其他算法


  • 列表不定义为其中的元素计数。列表以递归方式定义为空,或一对元素和其余元素:

    list([]).
    list([_A|B]) :- list(B).
    
    列表可以相同:

    same_lists([], []).
    same_lists([A|B], [A|C]) :- same_lists(B, C).
    
    或者一个可以比另一个短,即其前缀:

    list_prefix([], L):- list(L).
    list_prefix([A|B], [A|C]):- list_prefix(B, C).
    
    前缀结束时,后缀开始:

    list_split([], L, L):- list(L).
    list_split([A|B], Sfx, [A|C]):- list_split(B, Sfx, C).
    

    因此,一般的建议是:遵循类型,它们是如何构造的,并根据所有可能的情况分析情况。对于列表,它可以是空列表,也可以是非空列表。

    这就是我在问题1和问题2中寻找的内容。多谢各位。这使我的学习变得容易多了!也谢谢你理解我的提问方式和如何回答。很高兴能帮上忙。如果它对您有帮助,您也可以通过单击答案旁边的复选标记来“接受”答案。:)
    same_lists([], []).
    same_lists([A|B], [A|C]) :- same_lists(B, C).
    
    list_prefix([], L):- list(L).
    list_prefix([A|B], [A|C]):- list_prefix(B, C).
    
    list_split([], L, L):- list(L).
    list_split([A|B], Sfx, [A|C]):- list_split(B, Sfx, C).