如何有选择地 运行 从句中的目标

How to selectively run a goal in a clause

我正在尝试使用序言生成一些乳胶代码。我正在生成通过边与它们所属的世界相连的节点。我的代码是这样的:

print_valutations(Stream,Number_of_nodes,[Head|Tail]):-
 Number_of_nodes1 is Number_of_nodes+1,
 single_valutation(Stream,Number_of_nodes1,Head),
 print_valutations(Stream,Number_of_nodes1,Tail).

print_valutations(_,_,_):- !.

single_valutation(Stream,Number_of_nodes,[Head|Tail]):-
 write(Stream, "\node[circle, minimum size=6mm, draw]"),
 write(Stream, "[left of= 10mm]"),
 write(Stream, "[below of= "),
 Number_of_nodes1 is Number_of_nodes-1,
 write(Stream,Number_of_nodes1),
 write(Stream,"]("),
 write(Stream, Number_of_nodes),
 write(Stream,"){"),
 write(Stream,Head),
 writeln(Stream,"};"),
 val(Stream,Number_of_nodes,Tail).

single_valutation(_,_,_):- !.

val(Stream,Node,[Head|Tail]):-
display_val(Stream,Node,Head),
val(Stream,Node,Tail).

val(_,_,_):- !.

display_val(Stream,[]) :-
    write(Stream,"").

display_val(Stream,Node,[Head|Tail]) :-
   write(Stream,"\draw[->] ("),
   write(Stream,Node),
   write(Stream,") to ("),
   write(Stream,Head),
   writeln(Stream,");"),
   display_val(Stream,Node,Tail).


prova(FileName):-
 open(FileName, write, Stream),
 print_valutations(Stream, 100,[[a,[4]],[b,[3]],[c,[1]]]),
 close(Stream).

并且此代码生成以下 txt 文件:

    \node[circle, minimum size=6mm, draw][left of= 10mm][below of= 100](101){a};
    \draw[->] (101) to (4);
    \node[circle, minimum size=6mm, draw][left of= 10mm][below of= 101](102){b};
    \draw[->] (102) to (3);
    \node[circle, minimum size=6mm, draw][left of= 10mm][below of= 102](103){c};
    \draw[->] (103) to (1);

我要的是这个(只留第一行左边=10mm):

    \node[circle, minimum size=6mm, draw][left of= 10mm][below of= 100](101){a};
    \draw[->] (101) to (4);
    \node[circle, minimum size=6mm, draw][below of= 101](102){b};
    \draw[->] (102) to (3);
    \node[circle, minimum size=6mm, draw][below of= 102](103){c};
    \draw[->] (103) to (1);

我该怎么做?

首先我同意 Paulo 的观点,你应该使用 DCG。


答案的概念。

一个选择是在

周围添加一个guard
write(Stream, "[left of= 10mm]")

例如

(
    <guard>
->
   write(Stream, "[left of= 10mm]")
;
   true
)

参见:Predicate ->/2

守卫在处理列表中的第一项时需要检查。


工作代码。

这里只有修改后的代码。其余保持不变。 它还引发了一个文件错误,但我没有尝试查找并修复它,因为我没有修改文件访问代码。 生成的输出如下。

print_valutations(Stream,First, Number_of_nodes,[Head|Tail]):-
    Number_of_nodes1 is Number_of_nodes+1,
    single_valutation(Stream,First,Number_of_nodes1,Head),
    print_valutations(Stream,false,Number_of_nodes1,Tail).
print_valutations(_,_,_,_):- !.

single_valutation(Stream,First,Current_node_position,[Head|Tail]):-
    write(Stream, "\node[circle, minimum size=6mm, draw]"),
    (
        First
    ->
        write(Stream, "[left of= 10mm]")
    ;
        true
    ),
    write(Stream, "[below of= "),
    Current_node_position1 is Current_node_position-1,
    write(Stream,Current_node_position1),
    write(Stream,"]("),
    write(Stream, Current_node_position),
    write(Stream,"){"),
    write(Stream,Head),
    writeln(Stream,"};"),
    val(Stream,Current_node_position,Tail).
single_valutation(_,_,_,_):- !.

prova(FileName):-
    open(FileName, write, Stream),
    print_valutations(Stream, true, 100, [[a,[4]],[b,[3]],[c,[1]]]),
    close(Stream).

输出

\node[circle, minimum size=6mm, draw][left of= 10mm][below of= 100](101){a};
\draw[->] (101) to (4);
\node[circle, minimum size=6mm, draw][below of= 101](102){b};
\draw[->] (102) to (3);
\node[circle, minimum size=6mm, draw][below of= 102](103){c};
\draw[->] (103) to (1);