我想用prolog编写前缀函数,但它不起作用。
这是我的代码:
prefix(P,[X|_]) :-
P == X.
我希望此输入结果为true
:
?- prefix([1,2],[1,2,3,4]).
问题在于我希望X
返回并尝试将另一个值转换为true
。
你能告诉我错误在哪里吗?
答案 0 :(得分:3)
这是我的建议:
探索并使用久经考验的图书馆谓词:不要重新发明轮子!
阅读Prolog prologue以获取这些常用谓词的准确定义:member/2
,append/3
,length/2
,between/3
,{{3} },select/3
,succ/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])