我有一个prolog程序:
link(liverpool,preston).
link(liverpool,manchester).
link(preston,lancaster).
link(preston,manchester).
link(lancaster,carlisle).
link(lancaster,leeds).
link(carlisle,leeds).
link(manchester,leeds).
%checks to see if X is in the supplied list
inlist( X, [X|_]).
inlist( X, [_|Ys]) :- inlist( X, Ys).
merge([],L,L).
merge([H|T],BList,CList):-
inlist(H,BList),
merge(T,BList,CList).
merge([H|T],BList,[H|CList]):-
merge(T,BList,CList),
not(inlist(H,BList)).
如果我这样称呼合并可以合并:
merge([a,b,c],[d,e,f],Result). --> [a,b,c,d,e,f]
或更重要的是,它旨在解决的问题:
merge([a,b,c],[a,d,e,f],Result). --> [a,b,c,d,e,f]
但如果我这样称呼合并:
merge(X,[d,e,f],[a,b,c,d,e,f]).
堆栈溢出。对于旨在以单向工作的功能,这通常是可接受的行为吗?或者是否存在一些函数应该以两种方式工作的约定?
编辑:如果你这样称呼,合并就可以了:
merge([a,b,c],X,[a,b,c,d,e,f]). --> [d,e,f]
答案 0 :(得分:3)
首先,你不应该称这些"功能"。 "谓词"是正确的术语。
Prolog谓词通常适用于两种方式"。但在特定情况下,并不总是可行或值得付出努力。
要告知谓词的使用方式,可以使用模式声明。这些声明约定因系统而异。这些声明主要用作程序员的文档,很少被编译器使用,但可以通过测试框架和其他帮助工具来使用。
模式声明的约定示例:
还有一个约定(例如" Prolog的工艺"中描述),谓词的输入参数优先,输出参数最后。