是的,你说得对,点号是列表 cons 中缀运算符。它实际上是ISO Prolog标准所要求的,但通常被隐藏起来了。我一段时间之前就发现了(和使用了)这个语法:
:- module(eog, []).
:- op(103, xfy, (.)).
funcs(X, (V, Y)) :-
nonvar(X),
X =.. W.As,
( predicate_property(X, meta_predicate M)
, M \= phrase(2, ?, ?)
-> M =.. W.Ms
; true
),
seek_call(As, Ms, Bs, V),
Y =.. W.Bs.
seek_call([], [], _Bs, _V) :-
!, fail.
seek_call(A.As, M.Ms, A.Bs, V) :-
M @>= 0, M @=< 9,
!, seek_call(As, Ms, Bs, V).
seek_call(A.As, _, B.As, V) :-
nonvar(A),
A = $(F),
F =.. Fp.FAs,
( current_arithmetic_function(F)
-> V = (PH is F)
; append(FAs, [PH], FBs),
V =.. Fp.FBs
),
!, B = PH.
seek_call(A.As, _.Ms, B.As, V) :-
nonvar(A),
A =.. F.FAs,
seek_call(FAs, Ms, FBs, V),
!, B =.. F.FBs.
seek_call(A.As, _.Ms, A.Bs, V) :-
!, seek_call(As, Ms, Bs, V).
:- multifile user:goal_expansion/2.
user:goal_expansion(X, Y) :-
( X = (_ , _) ; X = (_ ; _) ; X = (_ -> _) )
-> !, fail
; funcs(X, Y).
我被建议不要这样做。实际上,[A | B] 语法是 . 运算符的演化,为了可读性而引入。
OT:那是什么代码?
上面的代码是我试图用函数来美化 Prolog 的尝试。也就是说,通过
$
,根据需要引入所需的临时变量(例如,在算术表达式中)。
fact(N, F) :-
N > 1 -> F is N * $fact($(N - 1)) ; F is 1.
每个$都引入了一个变量,在展开后,我们得到了一个更传统的fact/2
?- listing(fact).
plunit_eog:fact(A, C) :-
( A>1
-> B is A+ -1,
fact(B, D),
C is A*D
; C is 1
).
我们有很多表达式,这些表达式可能会很有用...
在IT技术方面。