prolog规则的提取算法
我必须在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
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规则,我的要求很明确
问题:
列表不定义为其中的元素计数。列表以递归方式定义为空,或一对元素和其余元素:
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).