强迫Prolog回溯

时间:2015-10-18 17:36:56

标签: list prolog

我想用prolog编写前缀函数,但它不起作用。

这是我的代码:

prefix(P,[X|_]) :-
    P == X.

我希望此输入结果为true

?- prefix([1,2],[1,2,3,4]).

问题在于我希望X返回并尝试将另一个值转换为true

你能告诉我错误在哪里吗?

3 个答案:

答案 0 :(得分:3)

这是我的建议:

  • 探索并使用久经考验的图书馆谓词:不要重新发明轮子!

  • 阅读Prolog prologue以获取这些常用谓词的准确定义:member/2append/3length/2between/3,{{3} },select/3succ/2

  • 尝试不使用元逻辑 Prolog工具,如(==)/2 - 如果您不需要。

  • 作为初学者,特别是专注于Prolog 的纯粹单调子集。

讲道结束:)

让我们回到这个问题!根据{{​​3}},我们可以像这样定义prefix_of/2

prefix_of(Prefix,List) :- 
   append(Prefix,_Suffix,List).

示例查询:

?- prefix_of([1,2],[1,2,3,4]).
true.

?- prefix_of(Prefix,[1,2,3,4]).
  Prefix = []
; Prefix = [1]
; Prefix = [1,2]
; Prefix = [1,2,3]
; Prefix = [1,2,3,4]
; false.

答案 1 :(得分:2)

P是一个列表,而X是一个元素。因此,需要对代码进行一些“深度”更改。也许

prefix([X|Ps], [X|Qs]) :- prefix(Ps, Qs).
prefix([], _).

答案 2 :(得分:1)

根据您的定义,prefix([1,2],[1,2,3,4])相当于[1,2] == 1,显然会失败。

您可能想要的是与prefix([2], [2,3,4])

的等效性