我必须创建一些"谓词列表"在prolog。 但我并不完全理解思维方式 如果我想创建一些有效的谓词,我必须学习。
我已经看过一些受欢迎的教程(也许我的搜索不够精确),但我找不到任何教程如何使用真正的基本步骤来规划算法。
例如......
任务:
编写一个
concat(X,Y,Z).
谓词,该谓词从列表X
和Y
中获取元素,并在列表Z
中连接它们。
我的分析算法:
首先,我将要连接的元素数量的域(列表
X
和Y
的长度)定义为非负整数(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,我将来如何找到这种类型的提示?我的问题有特定名称吗?
我有多精确 - 我可以尝试使用多少个案例和语言来实现我的算法,而不仅仅是"做"事情,但是"思考"如何规划和创建其他算法。
答案 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).
因此,一般建议是:遵循类型,如何构建,并根据所有可能的情况分析情况。对于列表,它是空的或非空列表。