构建prolog规则的提取算法

时间:2017-02-02 00:05:28

标签: prolog logic artificial-intelligence

我必须创建一些"谓词列表"在prolog。 但我并不完全理解思维方式 如果我想创建一些有效的谓词,我必须学习。

我已经看过一些受欢迎的教程(也许我的搜索不够精确),但我找不到任何教程如何使用真正的基本步骤来规划算法。

例如......

任务:

  

编写一个concat(X,Y,Z).谓词,该谓词从列表XY中获取元素,并在列表Z中连接它们。

我的分析算法:

  

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

concat([],[],[]).
  

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

     

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

concat(X,[],X).
  

...再次测试它,发现它正在处理一些意想不到的积极结果。

结果:

  

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

     

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

     

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

     

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

concat(X,[Y|_],[Y|X]).
  

这是我的算法获得脑缓冲区溢出的地方。

尊重stackoverflow规则,我准确地问。

问题:

  1. 有没有办法自己找到答案?我的意思是 - 不是问题的答案,而是我已经证明可以解决它的算法。 换句话说,算法的算法。

  2. 如果您可以回答问题1,我将来如何找到这种类型的提示?我的问题有特定名称吗?

  3. 我有多精确 - 我可以尝试使用多少个案例和语言来实现我的算法,而不仅仅是"做"事情,但是"思考"如何规划和创建其他算法。

1 个答案:

答案 0 :(得分:2)

列表未定义为其中元素的计数。列表是递归定义的,空的,或一对元素和其余元素:

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

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