如何有选择地 运行 从句中的目标
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
)
守卫在处理列表中的第一项时需要检查。
工作代码。
这里只有修改后的代码。其余保持不变。
它还引发了一个文件错误,但我没有尝试查找并修复它,因为我没有修改文件访问代码。
生成的输出如下。
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);
我正在尝试使用序言生成一些乳胶代码。我正在生成通过边与它们所属的世界相连的节点。我的代码是这样的:
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。
答案的概念。
一个选择是在
周围添加一个guardwrite(Stream, "[left of= 10mm]")
例如
(
<guard>
->
write(Stream, "[left of= 10mm]")
;
true
)
守卫在处理列表中的第一项时需要检查。
工作代码。
这里只有修改后的代码。其余保持不变。 它还引发了一个文件错误,但我没有尝试查找并修复它,因为我没有修改文件访问代码。 生成的输出如下。
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);